2010-05-14 5 views
14

하스켈에서 간단한 평균 함수를 개발하려고합니다. 이 작동하는 것 같다 :하스켈 도트 연산자

lst = [1, 3] 

x = fromIntegral (sum lst) 
y = fromIntegral(length lst) 

z = x/y 

을 왜 다음 버전 작업을하지 않는 이유는 무엇입니까?

lst = [1, 3] 

x = fromIntegral.sum lst 
y = fromIntegral.length lst 

z = x/y 
+1

그리고 당신은 평균을 계산하고 있기 때문에, http://stackoverflow.com/questions/2376981/haskell-types-frustrating-a-simple-average-function/2380437을 읽어보십시오 유형은 모두를 말한다 # 2380437. – kennytm

답변

16

연산자에 대한 haskell의 우선 순위 규칙이 혼란스러워지고 있습니다. 혼란 스럽습니다.

당신은

x = fromIntegral.sum lst 

하스켈이보고 쓸 때와 동일로 : 당신이 쓰는 무엇을 의미

x = fromIntegral.(sum lst) 

했다 :

x = (fromIntegral.sum) lst 
+8

사실입니다. 하지만 주변에 공백이없는 연산자를 쓰는 것은 때로는 오해로 이어질 수도 있습니다 (즉, 많은 OOP 중심 언어로 액세스하는 회원 구성과 유사하게 보입니다). '(from Integra. sum)'은 의문의 여지가 있지만 오해는 아닙니다. – ony

+1

솔직히 말해서 여기에 혼란 스러울 수있는 것은 Haskell의 선행 규칙 (진술하기 쉽습니다)이 아니라 Prelude에서 정의 된 각각의 우선 순위를 가진 어림짐작 (초보자에게) 배열입니다. – sigfpe

17

. (조성물) 따라서

fromIntegral.sum lst 

sum lst가 기능하지 않기 때문에 잘못

fromIntegral . (sum lst) 

로 해석 기능 애플리케이션보다 낮은 우선 순위를 갖는다.

10

난 그냥 "를 추가하고 싶었 구조에 $ ":

x = fromIntegral $ sum lst 
y = fromIntegral $ length lst 

가장 낮은 우선 순위를 가지며 너무 많은 괄호 레벨을 피할 수 있습니다. (.)와는 달리, 함수 합성을하지 않고, 오른쪽 인수를 평가하여 왼쪽 함수에 전달합니다.

($) :: (a -> b) -> a -> b 
(.) :: (b -> c) -> (a -> b) -> a -> c 
+1

그리고'x = fromIntegral '이라고 쓸 수도 있습니다. 합계 $ lst'는 OP가 원래 시도한 것과 더 가깝습니다. – yatima2975

+0

오른쪽 인수를 평가한다고 말하는 것이 정확하지 않습니다. 평가는 여전히 게으르다. 인수를 평가하려면 대신'$!'가 필요합니다. – Chuck

+0

이 솔루션이 효과가 있긴하지만 여기서 올바른 대답이라고 생각하지 않습니다. 나에게 그것은 OP가 운영자 우선 순위에 대해 혼란스러워하는 것 같다. 그러면 올바른 답을 표시하고 여기에서 괄호가 도움이된다는 것을 지적하는 것입니다. 아직 다른 연산자를 소개하지 않습니다. – Martijn