【问题标题】:How does mzero match guard type signature?mzero 如何匹配保护类型签名?
【发布时间】: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


【解决方案1】:

是的,mzero 能够返回一些 m a 其中a /= ()。但它也能够返回m ()guard 在第二种情况下使用它。

类似这样:

n :: Int
n = 5

5 可以是FloatDouble,但也可以是Int。编译器在类型检查期间选择所需的5 解释。

同样,编译器在类型检查期间为原始示例中的mzero 选择正确的类型。更准确地说,它发现需要m (),所以它选择了那个类型。

这里最重要的是

mzero :: MonadPlus m => m a

其实就是

mzero :: forall m a . MonadPlus m => m a

这表明mzero调用者 可以选择ma 的实际值(只要mMonadPlus)。因此,调用者可以选择a=() 进行类型检查。这个选择可以由用户通过类型注解做出,否则编译器会在类型检查时尝试推断正确的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2023-03-26
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多