我正在学习Haskell,在互联网上,我发现来自Philip Wadler的是paper 我读它并且根本不理解,但它以某种方式连接到多态函数。
例如:
polyfunc :: a -> a -> a
它是任何类型的多态函数。
与polyfunc
示例相关的自由定理是什么?
答案 0 :(得分:8)
我觉得如果我真的理解那篇论文,那么我写的任何代码都会被上帝合着。
我对这个问题的最好猜测是,所有polyfunc
可以做的总是返回第一个参数或总是返回第二个参数。所以实际上只有两个polyfunc
,
polyfuncA a _ = a
polyfuncB _ b = b
本文为您提供了证明该声明的方法。
这是一个非常重要的概念。例如,我以前参与过数据质量研究。这个自由定理说没有能从两个任意数据中选择最佳数据的函数。我们必须了解更多。实际上,我很惊讶地发现有些人愿意忽略它。
答案 1 :(得分:3)
我从来没有真正理解那篇论文中提出的算法,所以我想我会试着弄明白。
(1) Type of function in question
f :: a -> a -> a
(2) Rephrasing as a relation
f : ∀X. X -> X -> X
(3) By parametricity
(f, f) ∈ ∀X. X -> X -> X
(4) By definition of ∀ on relations
for all Q : A <=> A',
(fA, fA') ∈ Q -> Q -> Q
(5) Applying definition of -> on relations to the first -> in (4)
for all Q : A <=> A',
for all (x, x') ∈ Q,
(fA x, fA' x') ∈ Q -> Q
(6) Applying definition of -> on relations to (5)
for all Q : A <=> A',
for all (x, x') ∈ Q,
for all (y, y') ∈ Q,
(fA x y, fA' x' y') ∈ Q
此时我已经完成了扩展关系定义,但不确定如何从关系中恢复到函数和类型的术语,所以我找到了一个automatically derive the free theorem for a type的webapp。我不会破坏(但)它给出的结果,但看着它确实帮助我弄清楚我证明的下一步。
下一步是从关系土地回到功能土地,注意到Q可以是任何功能的类型,而且这仍然有效。
(7) Specializing Q to a function g :: p -> q
for all p, q
for all g :: p -> q
where g x = x'
and g y = y'
g (f x y) = f x' y'
(8) By definitions of x' and y'
for all p, q
for all g :: p -> q
g (f x y) = f (g x) (g y)
这看起来是对的,对吗?相当于使用g
转换这两个元素,然后让f
在它们之间进行选择,或者让f
选择一个元素,然后使用g
对其进行转换。通过参数化,f
无法根据g
的任何内容选择左侧还是右侧元素。
当然,特雷弗·库克的回答是正确的:f
必须总是选择第一个参数,或者总是选择第二个参数。我不确定我推导出的自由定理是否等同于它,或者它是一个较弱的版本。
顺便说一下,这是本文已明确涵盖的特殊情况。它给出了
的定理k :: x -> y -> x
当然与您的函数f
相同,其中x ~ a
和y ~ a
。它给出的结果与我描述的结果相同:
for all a, b, x, y
a (k x y) = k (a x) (b y)
如果我们选择b=a
来使两个结果等效。