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,但会被法律拒绝?
是的,该定律通过参数性免费成立。
即便如此,这些法律仍然具有价值。
它使人们无需精通编程语言理论即可了解它们。
如果将这些接口移植到具有较弱类型系统的语言,您将希望遵守这些规则。
在 Haskell 真正被赋予正式语义之前,我们在技术上并不知道这些自由定理是否成立。通过足够高的形式标准,仅仅假装 Haskell 是一个纯粹的多态 lambda 演算是不够的。所以我们不妨添加并检查这些“免费”法律,以防万一。
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |