2013-07-24 3 views
17

Ohne Klammern:Wie erklären Sie die Assoziativität des Bindeoperators in diesem hakell Ausdruck?

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

Klammerung links Assoziativität unter der Annahme:

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

Ist das nicht >>= links assoziativ:

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

Klammerung rechts Assoziativität vorausgesetzt? Wenn keine Klammern vorhanden sind, warum bewertet GHCi den Ausdruck so, als wäre >>= richtig assoziativ?

Antwort

19

Ja, >>= bleibt assoziativ. Lambdas erweitern jedoch so weit wie möglich. So ist die Anwesenheit der \n -> bedeutet, dass der einzig richtige Weg, um den Ausdruck zu analysieren ist als

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

Beachten Sie, dass Ihre „linke Assoziativität“ Form

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

ist nicht einmal Umfang zu korrigieren. Die n im endgültigen return ist nicht im Geltungsbereich.

+3

lambdas erstrecken sich so weit wie möglich. Es konnte nicht angezeigt werden. Vielen Dank ! – 0x777