According to the Haskell wikibook,称为Monadm是带有两个附加操作的Functor:

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

很好,但是我有些不同。在gory细节上,我有一个具有良好的unitjoin函数的类型,但是它的fmap表现不佳(fmap g . fmap f不一定是fmap (g.f))。因此,它不能成为Monad的实例。但是,我想给它尽可能多的通用功能。

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

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

最佳答案

好吧,这是您应该只使用unitjoin的一条法则。给定x :: m a

join (unit x) = x

为了表明这不仅来自无处,我们从现有的单子(monad)定律开始:
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

关于haskell - 这不是单子(monad),那是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17034427/

10-13 07:52