【发布时间】:2015-02-19 12:41:55
【问题描述】:
我无法理解 guard 的工作原理。为什么要进行类型检查? mzero 不能返回一些 m a where a /= () 吗?
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
mzero :: m a
【问题讨论】:
-
顺便说一句,Haskell 中不存在 类型不等式。只有类型相等
a ~ (),并且与所有约束一样,假设原则上这可能是正确的,即使编译器无法证明它——所以你永远不能否定约束。事实上这里 is 是真的,a ~ ()正是编译器为mzero推断的内容!
标签: haskell monads alternative-functor monadplus