Haskell 应用:证明`纯f<*&燃气轮机;x=纯(翻转($)<*&燃气轮机;x<*&燃气轮机;纯f`

Haskell 应用:证明`纯f<*&燃气轮机;x=纯(翻转($)<*&燃气轮机;x<*&燃气轮机;纯f`,haskell,applicative,category-theory,Haskell,Applicative,Category Theory,在我的研究过程中,我遇到了这个证明,但我不确定我的证明是否正确。问题是: 有人可能会想象交换定律的一个变体,它说明了如何将纯函数应用于有效的参数。使用上述法律,证明: pure f x=pure(翻转($)x pure f “上述法律”简单地指: pure id <*> v = v -- identity law pure f <*> pure x = pure (f x) -- homomorphism u <*> pure y = pure ($ y) &

在我的研究过程中,我遇到了这个证明,但我不确定我的证明是否正确。问题是:

有人可能会想象交换定律的一个变体,它说明了如何将纯函数应用于有效的参数。使用上述法律,证明:

pure f x=pure(翻转($)x pure f

“上述法律”简单地指:

pure id <*> v = v -- identity law
pure f <*> pure x = pure (f x) -- homomorphism
u <*> pure y = pure ($ y) <*> u -- interchange
u <*> (v <*> w) = pure (.) <*> u <*> v <*> w -- composition
pure id v=v——恒等式法则
纯f纯x=纯(f x)——同态
u纯y=纯($y)u——交换
u(v w)=纯的u v w--成分
我的证明如下:

pure f <*> x = pure (($) f) <*> x -- identical
pure f <*> x = pure ($) <*> pure f <*> x -- homomorphism
pure f <*> x = pure (flip ($)) <*> x <*> pure f -- flip arguments
pure fx=pure($)f)x——相同
纯f x=纯($)纯f x--同态
纯f x=纯(翻转($)x纯f--翻转参数

校对的前两步看起来不错,但最后一步不行。而
flip
的定义允许您使用以下规则:

f a b = flip f b a
这并不意味着:

pure f <*> a <*> b = pure (flip f) <*> b <*> a

我最终证明了这一点:

pure (flip ($)) <*> x <*> pure f
    = (pure (flip ($)) <*> x) <*> pure f -- <*> is left-associative
    = pure ($ f) <*> (pure (flip ($)) <*> x) -- interchange
    = pure (.) <*> pure ($ f) <*> pure (flip ($)) <*> x -- composition
    = pure (($ f) . (flip ($))) <*> x -- homomorphism
    = pure (flip ($) f . flip ($)) <*> x -- identical
    = pure f <*> x

我要指出的是,一般来说,当以单倍体函子的数学形式编写这些定理时,它们的涉及面要小得多,而不是应用版本,即使用等价类

class Functor f => Monoidal f where
  pure :: a -> f a
  (⑂) :: f a -> f b -> f (a,b)
那么法律就是

id <$> v = v
f <$> (g <$> v) = f . g <$> v
f <$> pure x = pure (f x)
x ⑂ pure y = fmap (,y) x
a⑂(b⑂c) = assoc <$> (a⑂b)⑂c
证明:

swap <$> x ⑂ pure u
    = swap <$> fmap (,u) x
    = swap . (,u) <$> x
    = (u,) <$> x
    = pure u ⑂ x
swap x⑂ 纯u
=交换fmap(,u)x
=交换。(,u)x
=(u,)x
=纯u⑂ x

非常感谢,我最终从右手边到左手边证明了这一点。我没有接受你的回答,因为它实际上没有包括证据,你愿意分享你的证据吗?我的证据与你的证据是相同的向后证据,最后有一些额外的步骤类似于@LeftRoundound的eta扩展。请随意接受您自己的完整答案。最后一步很简单,只需一次eta扩展,不是吗<代码>($f)。翻转(美元)≡ \x->($f)$($x)≡ \x->($x)$f≡ \x->f$x≡ f@leftarounda关于是的,应该是这样,我实际上在写一篇关于Typoclassopedia的文章,里面有练习的解决方案,这个解释是针对那篇文章的,所以我试着一点一点地解释给那些一开始努力理解它的人。顺便说一句,谢谢你的编辑,看起来好多了。
class Functor f => Monoidal f where
  pure :: a -> f a
  (⑂) :: f a -> f b -> f (a,b)
id <$> v = v
f <$> (g <$> v) = f . g <$> v
f <$> pure x = pure (f x)
x ⑂ pure y = fmap (,y) x
a⑂(b⑂c) = assoc <$> (a⑂b)⑂c
pure u ⑂ x = swap <$> x ⑂ pure u
swap <$> x ⑂ pure u
    = swap <$> fmap (,u) x
    = swap . (,u) <$> x
    = (u,) <$> x
    = pure u ⑂ x