2013-07-24 37 views
17

Nếu không có bất kỳ dấu ngoặc đơn:Làm thế nào để bạn giải thích sự kết hợp của toán tử liên kết trong biểu thức haskell này?

Prelude> [1,2] >>= \n -> ['a', 'b'] >>= \ch -> return (n, ch) 
[(1,'a'),(1,'b'),(2,'a'),(2,'b')] 

ngoặc giả associativity trái:

Prelude> [1,2] >>= (\n -> ['a', 'b'] >>= \ch -> return (n, ch)) 
[(1,'a'),(1,'b'),(2,'a'),(2,'b')] 

Không phải là >>= kết trái:

Prelude> ([1,2] >>= \n -> ['a', 'b']) >>= \ch -> return (n, ch) 
<interactive>:22:49: Not in scope: `n' 

ngoặc associativity đúng giả? Khi không có dấu ngoặc đơn, tại sao GHCi đánh giá biểu thức như thể >>= là kết hợp đúng?

Trả lời

19

Có, >>= là liên kết trái. Tuy nhiên, lambdas mở rộng càng nhiều càng tốt. Vì vậy, sự hiện diện của \n -> có nghĩa là con đường đúng đắn duy nhất để phân tích biểu thức là như

[1,2] >>= (\n -> ['a', 'b'] >>= \ch -> return (n, ch)) 

Lưu ý rằng bạn "associativity trái" hình thức

([1,2] >>= \n -> ['a', 'b']) >>= \ch -> return (n, ch) 

không phải là thậm chí phạm vi-chính xác. Số n trong số return cuối cùng nằm ngoài phạm vi.

+3

lambdas mở rộng càng nhiều càng tốt. Không thấy được. Cảm ơn ! – 0x777