Я обнаружил, что приоритет и ассоциативность являются для меня большим препятствием, чтобы понять, что грамматика пытается выразить на первый взгляд в коде Haskell.
Например,
blockyPlain :: Monad m => m t -> m t1 -> m (t, t1)
blockyPlain xs ys = xs >>= \x -> ys >>= \y -> return (x, y)
Опытным путем до меня наконец дошло, значит,
blockyPlain xs ys = xs >>= (\x -> (ys >>= (\y -> return (x, y))))
вместо
blockyPlain xs ys = xs >>= (\x -> ys) >>= (\y -> return (x, y))
Который работает как:
*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)]
Я могу получить информацию от ghci для (>>= )в качестве оператора, (infixl 1 >>= ).
А вот по -> информации нет, так как это не оператор.
Может ли кто-нибудь из вас, ребята, дать ссылку, чтобы упростить понимание этой грамматики?