優先順位と結合性は、文法が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 >> =)。
ただし、演算子ではないため、->の情報はありません。
皆さんの誰かが、この文法を理解しやすくするための参考資料を教えてもらえますか?