- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
理论上,Monad 是仿函数和特定应用仿函数的子集,尽管 Haskell 的类型系统中没有指出这一点。
知道这一点,给定一个 monad 并基于 return
和bind
,如何:
fmap
,<*>
?最佳答案
嗯,fmap
只是 (a -> b) -> f a -> f b
,即我们想用纯函数转换一元 Action 的结果。使用 do 表示法很容易编写:
fmap f m = do
a <- m
return (f a)
或者,写成“原始”:
fmap f m = m >>= \a -> return (f a)
这可用作 Control.Monad.liftM
.
pure :: a -> f a
当然是return
。 (<*>) :: f (a -> b) -> f a -> f b
有点棘手。我们有一个返回函数的操作,还有一个返回其参数的操作,并且我们希望有一个返回其结果的操作。再次用 do 表示法:
mf <*> mx = do
f <- mf
x <- mx
return (f x)
或者,脱糖:
mf <*> mx =
mf >>= \f ->
mx >>= \x ->
return (f x)
田田!这可通过 Control.Monad.ap
获得。 ,所以我们可以给出 Functor
的完整实例和Applicative
对于任何单子(monad) M
如下:
instance Functor M where
fmap = liftM
instance Applicative M where
pure = return
(<*>) = ap
理想情况下,我们能够直接在Monad
中指定这些实现。 ,减轻为每个 monad 定义单独实例的负担,例如 this proposal 。如果发生这种情况,那么创建Applicative
就不存在真正的障碍了。 Monad
的父类(super class),因为它将确保它不会破坏任何现有代码。另一方面,这意味着定义 Functor
涉及的样板文件和Applicative
给定 Monad
的实例是最小的,所以很容易成为一个“好公民”(并且应该为任何 monad 定义这样的实例)。
关于haskell - 如何证明单子(monad)是一个仿函数和一个应用仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098247/
我是一名优秀的程序员,十分优秀!