Haskell:hackage Control.Applicative 文章中应用函子法则的描述存在缺陷?:它说 Applicative 决定函子

2024-04-20

我想我发现了一个缺陷黑客文章Control.Applicative http://hackage.haskell.org/package/base-4.8.0.0/docs/Control-Applicative.html。 作为对应用函子定律的描述,它说:

class Functor f => Applicative f where

具有应用程序的函子,提供操作 嵌入纯表达式 (pure),并进行序列计算并结合它们的结果(<*>).

最小的完整定义必须包括满足以下定律的这些函数的实现:

identity

pure id <*> v = v

作品

pure (.) <*> u <*> v <*> w = u <*> (v <*> w)

同态

pure f <*> pure x = pure (f x)

交换

u <*> pure y = pure ($ y) <*> u

(请注意,这并没有提及 fmap 的任何内容)并且它指出这些法律决定了Functor实例:

由于这些法律,Functorf 的实例将满足

fmap f x = pure f <*> x

起初我认为这显然是错误的。也就是说,我猜一定存在一个类型构造函数t满足以下两个条件:

  1. t是一个实例Applicative满足上述规则,并且
  2. 有两种不同的实现instance (Functor t)(即有两个不同的功能fmap1, fmap2 :: (a->b) -> (t a->t b), 满足函子定律)。

如果(且仅当)上述正确,则上述陈述must被重写为

f 的函子实例必须满足

fmap f x = pure f <*> x

作为这些法律的结果,这满足Functor laws.

这显然是正确的,不管我的猜测正确与否.

我的问题是: 我的猜测正确吗?有没有t具有所需的条件?


以下是我在尝试自己回答这个问题时的想法的解释。

如果我们只是数学家对实际的 Haskell 编程不感兴趣,我们可以很容易地肯定地回答这个问题。实际上,

t = Identity
newtype Identity a = Identity {runIdentity :: a}

满足上面的要求1和2(事实上,几乎任何事情都可以)。的确,Identity是一个简单的例子Functor and Applicative,如定义Data.Functor.Identity http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Functor-Identity.html。 (这满足fmap f = (pure f <*>).) 定义另一个“实现”instance (Functor f), 采取, 对于每种类型a, 两个函数

transf_a, tinv_a :: a -> a

这样

tinv_a . transf_a = id

(这是,理论上的设定, 简单的)。现在定义

instance (Functor Identity) where
 fmap (f :: a->b) = Identity . transf_b . f . tinv_a . runIdentity

这满足Functor法律,并且是一种与普通实施不同的实施,如果有的话

x :: a
f :: a -> b

这样

f x /= transf_b $ f $ tinv_a x

但我们是否可以在 Haskell 中做到这一点还不是很明显。是这样的:

class (Isom a) where
 transf, tinv :: a -> a

instance (Isom a) where
 transf = id
 tinv = id

specialized instance (Isom Bool) where
 transf = not
 tinv = not

在哈斯克尔可能吗?


Edit

我忘记写一些非常重要的事情了。我认得Control.Applicative作为 GHC 基础包的一部分,所以我也想知道我的问题的答案是否会随着任何 GHC 语言扩展而改变,例如FlexibleInstances or OverlappingInstances,我还不明白。


Haskell 中的任何类型最多可以有一个实例Functor,所以你的猜测不正确:对于no type t(无论它是否是一个实例Applicative)是否可以存在两种不同的实现instance (Functor t). See: http://article.gmane.org/gmane.comp.lang.haskell.libraries/15384 http://article.gmane.org/gmane.comp.lang.haskell.libraries/15384

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell:hackage Control.Applicative 文章中应用函子法则的描述存在缺陷?:它说 Applicative 决定函子 的相关文章

随机推荐