2012-06-28 2 views
17

우선 순위와 결합 성은 문법이 처음으로 haskell 코드로 표현하려고 시도하는 것을 이해하는 데있어 큰 장애물이다. 예를 들어 하스켈 우선 순위 : 람다와 연산자

, 실험에 의해

blockyPlain :: Monad m => m t -> m t1 -> m (t, t1) 
blockyPlain xs ys = xs >>= \x -> ys >>= \y -> return (x, y) 

, 나는 마지막으로 어떤 작품이 의미

blockyPlain xs ys = xs >>= (\x -> (ys >>= (\y -> return (x, y)))) 

대신

blockyPlain xs ys = xs >>= (\x -> ys) >>= (\y -> return (x, y)) 

을 가지고 :

*Main> blockyPlain [1,2,3] [4,5,6] 
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] 
,536,

ghci에서 (>> =) 연산자에 대한 정보를 얻을 수 있습니다 (infixl 1 >> =).

하지만 운영자가 아니기 때문에 ->에 대한 정보가 없습니다.

여러분 중 누군가가이 문법을 쉽게 이해할 수 있도록 참조 할 수 있습니까?

+0

에서 [하스켈 보고서] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-220003)는 Haskell 문법에 대한 명확한 참조입니다. BNF 문법은 아마도 여러분이 가지고있는 질문에 대해 약간 낮은 수준 일 것입니다. 질문...? –

답변

23

람다 규칙은 매우 간단합니다. 람다 본문은 언밸런스 괄호를 사용하지 않고 가능한 한 오른쪽 오른쪽으로 확장됩니다.

f (\x -> foo (bar baz) *** quux >>= quuxbar) 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
         body 
+3

마지막으로 적용된다는 의미입니다. 즉, (->) 우선 순위가 다른 연산자보다 낮습니다. 나는 'do'와 (<-)도 마찬가지라고 생각한다. 가능한 한 멀리 확장하고, 마지막으로 적용하며, 어떤 연산자보다 우선 순위가 낮다. –

+4

나는 우선 순위에 대해 "첫 번째"와 "마지막"이라는 용어를별로 좋아하지 않는다. 나는 그것이 평가 순서와 그룹으로 묶여 있다고 생각한다. 그것은 내가 수학 교육에서 반대하는 것입니다. 나는 운영자가 피연산자를 붙잡고 있다고 생각하면서 "단단하고" "느슨한"것이 좋습니다. 어쨌든,'->'은 두 개의 용어를 연결하지 않기 때문에 중위 연산자가 아닙니다. 오히려 람다 (lambda)는 표현을위한 구문 양식입니다. 그래서 저는 사업자의 관점에서 대답하지 않았습니다. – luqui

+1

두 가지 모두 잘 찍었습니다. "첫 번째"와 "마지막"은 대부분의 k-12 (그리고 몇 학부생이 아닌) 수학 커리큘럼에서 작업 순서에 대해 사용할 때 사용되는 구입니다. 제 시도는 일반적으로 사용 된 용어 (매우 정확하지는 않지만)를 귀하의 아주 미세한 답변에 적용하는 것이 었습니다. –

7

엄지 손가락의 좋은 규칙은 구문 구조에 내장보다 우선 순위가있는 사용자 정의 연산자를 만들 수 없다는 것 같다. 예를 들어이 예를 고려해

(if b then f *** x else f) *** y 

있습니다하지 하스켈의 구문 구조의 많은 (do과 :에 관계없이 ***의 연관성의

if b then f *** x else f *** y 

을, 아무도는 바인딩에 그것을 기대하지 않을 것이다 case 때문에 레이아웃 구문 약간 특별) let 그러나 다른 예로서 사용될 수있다 :

(let x = y in y *** x) /= ((let x = y in y) *** x) 
+2

기능 응용 프로그램 및 레코드 업데이트를 제외하고 ... – luqui