Haskell Precedence: Lambda und Operator

Ich fand, dass Vorrang und Assoziativität ein großes Hindernis für mich sind, um zu verstehen, was die Grammatik auf den ersten Blick für Haskell-Code auszudrücken versucht.

Zum Beispiel,

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

Durch Experiment habe ich endlich verstanden,

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

anstatt

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

Welches funktioniert als:

*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)]

Ich kann Informationen von ghci für (>> =) als Operator erhalten (infixl 1 >> =).

Aber es gibt keine Informationen für -> da es kein Operator ist.

Könnte jemand von euch einen Hinweis geben, damit diese Grammatik leichter zu verstehen ist?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage