liftA2是否保留关联性?

问题描述 投票:6回答:1

给出(??)这样的操作>

(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的同质性。然后,我们免费获得HomomorphismInterchange。但是现在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)(...

haskell applicative semigroup
1个回答
0
投票

这里是证明的一半。回想一下<$><*>都是左关联的,所以x <*> y <*> z = (x <*> y) <*> z

© www.soinside.com 2019 - 2024. All rights reserved.