10

根据 Haskell wikibookMonad被调用m的是Functor带有两个额外操作的 a:

unit :: a -> m a
join :: m (m a) -> m a

这很好,但我有一些不同的东西。修饰血淋淋的细节,我有一种功能很好的类型unitjoinfmap表现不佳(fmap g . fmap f不一定fmap (g.f))。因此,它不能成为 的实例Monad。尽管如此,我想给它尽可能多的通用功能。

所以我的问题是,什么类别的理论结构与单子相似,因为它们有一个unitjoin

我意识到在某种程度上,上述问题定义不明确。对于 monad,unitandjoin定义仅在定义方面才有意义fmap。没有fmap,您将无法定义任何单子定律,因此unit/的任何定义join都将同样“有效”。所以我正在寻找其他功能,而不是在这些和功能fmap上定义一些“非单子”法则可能是有意义的。unitjoin

4

1 回答 1

3

好吧,这是您应该拥有的一条定律unitjoin。给定x :: m a

join (unit x) = x

为了证明这不是凭空而来的,让我们从现有的单子定律开始:

return x >>= f = f x

鉴于m >>= f = join (fmap f m)

join (fmap f (return x)) = f x

选择f = id

join (fmap id (return x)) = id x

使用函子定律fmap id = id

join (id (return x)) = id x

使用明显的id a = a

join (return x) = x
于 2013-06-27T17:11:13.380 回答