Pierwszeństwo Haskella: Lambda i operator

Stwierdziłem, że pierwszeństwo i asocjatywność to dla mnie wielka przeszkoda, aby zrozumieć, co gramatyka stara się wyrazić na pierwszy rzut oka na kod haskell.

Na przykład,

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

Przez eksperyment w końcu mam to na myśli,

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

zamiast

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

Który działa jako:

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

Mogę uzyskać informacje z ghci for (>> =) jako operator, (infixl 1 >> =).

Ale nie ma informacji dla -> ponieważ nie jest to operator.

Czy ktoś z was mógłby podać jakieś wskazówki, które ułatwią zrozumienie tej gramatyki?

questionAnswers(2)

yourAnswerToTheQuestion