给定一个(??)
这样的操作
(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 Vacuous where
fmap f = id
instance Applicative Vacuous 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
也有待确定。我们实际上没有其他方法可以定义这一点。
如果我们想实现同一性法则,这将迫使i
同一性结束comb
。然后我们免费获得同态和交换。但是现在组合力强制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)
强迫我们满足财产。
有反例吗?如果不是,我们如何证明这个属性?