According to the Haskell wikibook,名为Monad
的{{1}}是m
,还有两项额外的操作:
Functor
这很好,但我有些不同。对血腥细节进行着色,我的类型具有良好的unit :: a -> m a
join :: m (m a) -> m a
和unit
函数,但其join
表现不佳(fmap
不一定是{{1} })。因此,它不能成为fmap g . fmap f
的实例。尽管如此,我还是希望尽可能多地提供通用功能。
所以我的问题是,什么类别的理论结构与monad相似,因为他们有fmap (g.f)
和Monad
?
我意识到在某种程度上,上述问题是不明确的。对于monad,unit
和join
定义仅对unit
定义有意义。如果没有join
,则无法定义任何monad法律,因此fmap
/ fmap
的任何定义都同样“有效”。所以我正在寻找除unit
以外的函数,在这些join
和fmap
函数中定义一些“非monad”定律可能是有意义的。
答案 0 :(得分:3)
这里只有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