`Alt` 类型类的函子分布规律是微不足道的吗?

Asa*_*din 7 haskell functor free-theorem

我一直在寻找法律的Alt类型类,它看起来像这样:

class Functor f => Alt f
  where
  (<!>) :: f a -> f a -> f a
Run Code Online (Sandbox Code Playgroud)

其中一项法律是这样的:

<$> left-distributes over <!>:  f <$> (a <!> b) = (f <$> a) <!> (f <$> b)
Run Code Online (Sandbox Code Playgroud)

更详细地说,这是:

fmap f $ (<!>) a b = (<!>) (fmap f a) (fmap f b)
Run Code Online (Sandbox Code Playgroud)

假设我们取消了<!>操作,即我们假设类是这样写的:

class Functor f => Alt f
  where
  alt :: (f a, f a) -> f a
Run Code Online (Sandbox Code Playgroud)

我们可以这样写一个组合器:

class Functor f => Alt f
  where
  (<!>) :: f a -> f a -> f a
Run Code Online (Sandbox Code Playgroud)

这表示type Pair a = (a, a)函子与给定函子的组合f。所以它本身就是函子的态射映射。

有问题的法律现在可以这样写(不改变其含义):

<$> left-distributes over <!>:  f <$> (a <!> b) = (f <$> a) <!> (f <$> b)
Run Code Online (Sandbox Code Playgroud)

请注意,mapBoth f仅适用fmap f于 的两个参数alt,就像在法律的原始陈述中一样。

这类似于要求alt是从函子(f -, f -)到函子的自然转换f -

但是,alt's 类型的函数不是自然变换实际上是不可能的吗?如何编写类型检查的“错误”实现alt,但会被法律拒绝?

Li-*_*Xia 3

是的,该定律通过参数性免费成立。

即便如此,这些法律仍然具有价值。

  1. 它使人们无需精通编程语言理论即可了解它们。

  2. 如果将这些接口移植到具有较弱类型系统的语言,您将希望遵守这些规则。

  3. 在 Haskell 真正被赋予正式语义之前,我们在技术上并不知道这些自由定理是否成立。通过足够高的形式标准,仅仅假装 Haskell 是一个纯粹的多态 lambda 演算是不够的。所以我们不妨添加并检查这些“免费”法律,以防万一。