我发现优先级和关联性是我理解语法乍一看试图表达的 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 >>=) 的信息。
但是没有关于 -> 的信息,因为它不是运算符。
你们中的某个人可以提供一些参考以使这个语法更容易掌握吗?