如果返回a = return b那么a = b?

PyR*_*lez 46 monads haskell equality semantics equational-reasoning

如果那样的return a = return b话你能证明a=b吗?当我使用时=,我的意思是在法律和证据意义上,而不是Eq阶级意义上.

我认识的每一个单子似乎都满足了这一点,我想不出一个有效的monad(Const a不是一个算子和应用,而不是一个monad.)

And*_*uer 65

不.考虑一下琐碎的monad:

data Trivial a = Cow

instance Monad Trivial where
  _ >>= _ = Cow
  return _ = Cow
Run Code Online (Sandbox Code Playgroud)

  • 为什么我会在Haskell程序中通过写"Cow"的机会? (53认同)
  • ...更好地称为`Const()`. (19认同)
  • @dfeuer:参数化加上需要遵守monad规则可以用来排除中间地带,琐碎的monad是唯一一个违反这个的情况,其他一切都需要调用函数传递给`(>> =)`有效的"a" - 或者它将失败第一个monad法则. - `Cont()`是同形的简单monad - 这两个观察的证据都留给你作为练习.;)在comonad情况下有一个双重参数,如果`wa = wb`在结构上,那么`w`是无人居住的comonad或'a = b`. (14认同)
  • 那些非平凡的monad呢? (7认同)
  • 注意:`Cont Void`和`Cont()`都有效,但原因各有不同. (2认同)