2013-07-24 13 views
17

Bez nawiasach:Jak wyjaśnić powiązanie operatora powiązania w tym wyrażeniu haskell?

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

Nawiasy zakładając lewy skojarzenia:

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

nawiasy przy założeniu właściwej skojarzenia:

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

nie jest >>= wiązanie lewe? Jeśli nie ma nawiasów, dlaczego GHCi ocenia wyrażenie tak, jakby >>= było prawidłowe asocjacyjne?

Odpowiedz

19

Tak, >>= jest skojarzony. Jednak lambdas przedłużyć w miarę możliwości. Tak więc obecność \n -> oznacza, że ​​jedyną właściwą drogą do analizowania wyrażenie jest

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

pamiętać, że „lewy asocjatywność” forma

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

nie jest jeszcze zakres-poprawne. Numer n w ostatecznym return jest poza zakresem.

+3

lambdas rozciągają się tak daleko, jak to możliwe. Nie udało się tego zobaczyć. Dzięki ! – 0x777

Powiązane problemy