众所周知的事实(>>=)可以使用而实现fmap,join并且join可以使用实现>>=.是否有任何理由我们没有Monad使用join包含和使用以下默认定义来定义类?
join x = x >>= id
x >>= f = join $ f <$> x
Run Code Online (Sandbox Code Playgroud)
这将允许最小定义包括just (>>=)或join,而不是强制(>>=).考虑到类别理论倾向于支持,可能会有点帮助join.
反对修改类的常见理由是我们打破了向后兼容性.但是,在这种情况下,这不会发生 - 我们只增加了定义Monad使用的可能性join.
适用于Monoidal Functor:
mappend :: f -> f -> f
$ :: (a -> b) -> a -> b
<*> :: f(a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
但是我没有在应用类型类的定义中看到有关Monoid的任何参考,你能告诉我为什么吗?
定义:
class Functor f => Applicative (f :: * -> *) where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
GHC.Base.liftA2 :: (a -> b -> c) -> f a -> f b -> f c
(*>) :: f a …Run Code Online (Sandbox Code Playgroud) Typeclassopedia提供以下练习:
按单位和(**)实现纯和(<*>),反之亦然.
这是Monoidal和MyApplicative:
class Functor f => Monoidal f where
u :: f () -- using `u` rather than `unit`
dotdot :: f a -> f b -> f (a,b) -- using instead of `(**)`
class Functor f => MyApplicative f where
p :: a -> f a -- using instead of `pure`
apply :: f (a -> b) -> f a -> f b -- using instead of `(<**>)`
Run Code Online (Sandbox Code Playgroud)
首先,让我展示Maybe类似的数据类型:
data Option …Run Code Online (Sandbox Code Playgroud)