【问题标题】:If return a = return b then does a=b?如果 return a = return b 那么 a=b 吗?
【发布时间】:2016-05-02 10:58:45
【问题描述】:

你能证明如果return a = return b 那么a=b?当我使用= 时,我指的是法律和证明的意义,而不是Eq 类的意义。

我知道的每个 monad 似乎都能满足这一点,我想不出一个不会满足的有效 monad(Const a 是函子和应用程序,但不是 monad。)

【问题讨论】:

    标签: haskell monads semantics equality equational-reasoning


    【解决方案1】:

    没有。考虑微不足道的 monad:

    data Trivial a = Cow
    
    instance Monad Trivial where
      _ >>= _ = Cow
      return _ = Cow
    

    【讨论】:

    • ...更好地称为Const ()
    • 为什么我会错过在 Haskell 程序中写 Cow 的机会?
    • 不平凡的单子呢?
    • @dfeuer:参数化加上需要遵守 monad 法则可以用来排除中间立场,平凡的 monad 是唯一违反这一点的情况,其他一切都需要调用传递的函数使用有效的a 发送至(>>=)——否则它将不符合第一条单子定律。 -- Cont () 是同构的微不足道的单子 -- 这两个观察的证明留给你作为练习。 ;) 在comonad 的情况下有一个双重参数,如果w a = w b 在结构上那么w 是无人居住的comonad 或a = b
    • 注意:Cont VoidCont () 都有效,但原因略有不同。
    猜你喜欢
    • 2017-06-11
    • 2017-04-06
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2019-10-27
    • 2021-10-06
    相关资源
    最近更新 更多