让我对为什么这个等式成立作一个更加独立的描述: 那么,为什么是x >>= (return . f) = fmap f x呢? 这是从三个单子定律和参数性(免费)得出的,这意味着: 考虑函数return :: forall a. F a。因为这个函数必须在所有类型a上工作,所以它不能改变或创建a类型的新元素,而只能复制或忘记a类型的值。因此,在应用return之前或之后,我们是否应用任何函数f :: a -> c来将所有a改变为c并不重要。 在左边我们将f应用于return的参数,在右边我们将f应用于结果:
return (f v) = fmap f (return v) (free theorem for return)
类似地,考虑函数>>= :: forall a b. F a -> (a -> F b) -> F b。因为该函数必须在所有类型a上工作,所以它不能改变或创建类型a的新元素,而只能复制或忘记类型a的值。因此,在应用>>=之前还是之后应用任何函数f :: a -> c以将所有a改变为c是无关紧要的。 在左边我们将f应用于>>=的参数,在右边我们将f应用于结果:
x >>= (fmap f . g) = fmap f (x >>= g) (free theorem for bind)
3条答案
按热度按时间hyrbngr71#
Control.Applicative
表示根据这些定律,f的
Functor
示例将满足Applicative
和Monad
之间的关系是x一个一个一个一个x一个一个二个x
ap
表示相当于
因此
x6h2sr282#
如果
F
是一个Functor
,并且你有一个函数foobar :: (a -> b) -> F a -> F b
使得foobar id = id
(也就是说,它遵循第一函子定律),那么foobar = fmap
。那么
liftM id xs
是什么呢?即
liftM id = id
。因此,或者换句话说。通过
Applicative
定律的epheriment's answer也是得出这一结论的有效方式。i5desfxk3#
让我对为什么这个等式成立作一个更加独立的描述:
那么,为什么是
x >>= (return . f) = fmap f x
呢?这是从三个单子定律和参数性(免费)得出的,这意味着:
考虑函数
return :: forall a. F a
。因为这个函数必须在所有类型a
上工作,所以它不能改变或创建a
类型的新元素,而只能复制或忘记a
类型的值。因此,在应用return
之前或之后,我们是否应用任何函数f :: a -> c
来将所有a
改变为c
并不重要。在左边我们将
f
应用于return
的参数,在右边我们将f
应用于结果:类似地,考虑函数
>>= :: forall a b. F a -> (a -> F b) -> F b
。因为该函数必须在所有类型a
上工作,所以它不能改变或创建类型a
的新元素,而只能复制或忘记类型a
的值。因此,在应用>>=
之前还是之后应用任何函数f :: a -> c
以将所有a
改变为c
是无关紧要的。在左边我们将
f
应用于>>=
的参数,在右边我们将f
应用于结果:如果我们现在简单地示例化g = return,我们得到:
对于这个方程,我们可以在左边应用自由返回定理(
fmap f . return = return . f
),在右边应用左单位单子法则(x >>= return = x
):好的。