Haskell Precedence: Lambda y operador

Encontré la precedencia y la asociatividad es un gran obstáculo para que entienda lo que la gramática está tratando de expresar a primera vista con el código de haskell.

Por ejemplo,

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

Por experimento, finalmente lo entendí,

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

en lugar de

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

Que funciona como:

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

Puedo obtener información de ghci para (>> =) como operador, (infijo 1 >> =).

Pero no hay información para -> ya que no es un operador.

¿Podría alguien de ustedes dar alguna referencia para hacer que esta cosa de la gramática sea más fácil de entender?

Respuestas a la pregunta(2)

Su respuesta a la pregunta