给出(??)
这样的操作>
(a ?? b) ?? c = a ?? (b ?? c)
(也就是说
(??)
是关联的]
必须是这种情况
liftA2 (??) (liftA2 (??) a b) c = liftA2 (??) a (liftA2 (??) b c)
(也就是说,
liftA2 (??)
是关联的]
如果愿意,可以将其重写为:
fmap (??) (fmap (??) a <*> b) <*> c = fmap (??) a <*> (fmap (??) b <*> c)
我花了一点时间盯着适用法律,但我无法提出证明就是这种情况。因此,我开始提出反对。我尝试过的所有开箱即用的应用程序(
Maybe
,[]
,Either
等)都遵循法律,因此我认为自己可以创建自己的应用程序。
我最好的主意是使空虚的应用程序带有附加的信息。
data Vacuous a = Vac Alg
Alg
是一些代数,我会在以后方便时定义,以使该属性失效,但适用法律成功。
现在我们这样定义实例:
instance Functor Test where fmap f = id instance Applicative Test where pure x = Vac i liftA2 f (Vac a) (Vac b) = Vac (comb a b) (Vac a) <*> (Vac b) = Vac (comb a b)
i
是要确定的Alg
的某个元素,而comb
是要确定的Alg
的二进制组合器。我们实际上没有其他方法可以定义它。
如果我们想满足Identiy
法则,这将强制i
成为comb
的同质性。然后,我们免费获得Homomorphism和Interchange。但是现在Composition强制comb
关联于Alg
((pure (.) <*> Vac u) <*> Vac v) <*> Vac w = Vac u <*> (Vac v <*> Vac w) ((Vac i <*> Vac u) <*> Vac v) <*> Vac w = Vac u <*> (Vac v <*> Vac w) (Vac u <*> Vac v) <*> Vac w = Vac u <*> (Vac v <*> Vac w) (Vac (comb u v)) <*> Vac w = Vac u <*> (Vac (comb v w)) Vac (comb (comb u v) w) = Vac (comb u (comb v w)) comb (comb u v) w = comb u (comb v w)
强迫我们满足财产。
有反例吗?如果不能,我们如何证明该财产?
给出一个运算(??)使得(a ?? b)?? c = a ?? (b ?? c)(也就是说(??)是关联的)是否必须满足liftA2(??)(liftA2(??)ab)c = liftA2(??)a(liftA2(?? )bc)(...
这里是证明的一半。回想一下<$>
和<*>
都是左关联的,所以x <*> y <*> z = (x <*> y) <*> z
。