繁体   English   中英

在纯粹和liftA2方面,什么是适用的仿函数法则?

[英]What are the applicative functor laws in terms of pure and liftA2?

我正在使用pureliftA2来配制Applicative(因此(<*>) = liftA2 id成为派生组合子)。

我可以想到一堆候选法则,但我不确定最小集合是什么。

  1. f <$> pure x = pure (fx)
  2. f <$> liftA2 gxy = liftA2 ((f .) . g) xy
  3. liftA2 f (pure x) y = fx <$> y
  4. liftA2 fx (pure y) = liftA2 (flip f) (pure y) x
  5. liftA2 f (g <$> x) (h <$> y) = liftA2 (\\xy -> f (gx) (hy)) xy
  6. ...

基于McBride和Paterson的Monoidal定律 (第7节),我建议对liftA2pure进行以下定律。

左右身份

liftA2 (\_ y -> y) (pure x) fy       = fy
liftA2 (\x _ -> x) fx       (pure y) = fx

关联

liftA2 id           (liftA2 (\x y z -> f x y z) fx fy) fz =
liftA2 (flip id) fx (liftA2 (\y z x -> f x y z)    fy  fz)

自然性

liftA2 (\x y -> o (f x) (g y)) fx fy = liftA2 o (fmap f fx) (fmap g fy)

目前尚不清楚这些是否足以涵盖fmapApplicativepureliftA2之间的关系。 让我们看看我们是否可以从上述法律证明

fmap f fx = liftA2 id (pure f) fx

我们将从fmap f fx 以下所有内容都是等效的。

fmap f fx
liftA2 (\x _ -> x) (fmap f fx) (         pure y )     -- by right identity
liftA2 (\x _ -> x) (fmap f fx) (     id (pure y))     -- id x = x by definition
liftA2 (\x _ -> x) (fmap f fx) (fmap id (pure y))     -- fmap id = id (Functor law)
liftA2 (\x y -> (\x _ -> x) (f x) (id y)) fx (pure y) -- by naturality
liftA2 (\x _ -> f x                     ) fx (pure y) -- apply constant function

在这一点上,我们用liftA2pure和任何y写了fmap ; fmap完全由上述法律决定。 尚未经证实的证据的其余部分由犹豫不决的作者留下作为坚定读者的练习。

根据在线书籍, 了解你的Haskell:Functors,Applicative Functors和Monoids ,Appplicative Functor法律如下,但由于格式原因进行了重组; 但是,我正在使这个帖子社区可编辑,因为如果有人可以嵌入派生将是有用的:

    identity]               v = pure id <*> v
homomorphism]      pure (f x) = pure f <*> pure x
 interchange]    u <*> pure y = pure ($ y) <*> u
 composition] u <*> (v <*> w) = pure (.) <*> u <*> v <*> w

注意:

function composition]  (.) = (a->b) -> (b->c) -> (a->c)
application operator]    $ = (a->b) -> a -> b

在Reddit找到治疗方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM