According to the Haskell wikibook,称为Monad
的m
是带有两个附加操作的Functor
:
unit :: a -> m a
join :: m (m a) -> m a
很好,但是我有些不同。在gory细节上,我有一个具有良好的
unit
和join
函数的类型,但是它的fmap
表现不佳(fmap g . fmap f
不一定是fmap (g.f)
)。因此,它不能成为Monad
的实例。但是,我想给它尽可能多的通用功能。所以我的问题是,什么类别的理论结构与monad相似,因为它们具有
unit
和join
?我意识到,在某种程度上,上述问题是不明确的。对于monad,
unit
和join
定义仅在fmap
定义方面有意义。没有fmap
,您就无法定义任何monad法则,因此unit
/join
的任何定义都将同样“有效”。因此,我正在寻找fmap
以外的函数,以便在这些unit
和join
函数上定义一些“非单子(monad)”定律可能是有意义的。 最佳答案
好吧,这是您应该只使用unit
和join
的一条法则。给定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/