繁体   English   中英

多态推理

[英]Polymorphic reasoning

我正在学习Haskell,在互联网上我找到了来自Philip Wadler的论文
我读它并且根本不理解,但它以某种方式连接到多态函数。

例如:

polyfunc :: a -> a -> a

它是任何类型的多态函数。

连接示例polyfunc的自由定理是什么?

我觉得如果我真的理解那篇论文,那么我写的任何代码都会被上帝合着。

我对这个问题的最好猜测是,所有polyfunc都可以做的总是返回第一个参数或总是返回第二个参数。 所以实际上只有两个polyfunc实现,

polyfuncA a _ = a
polyfuncB _ b = b

本文为您提供了证明该声明的方法。

这是一个非常重要的概念。 例如,我以前参与过数据质量研究。 这个自由定理说没有能从两个任意数据中选择最佳数据的函数。 我们必须了解更多。 实际上,我很惊讶地发现有些人愿意忽略它。

我从来没有真正理解那篇论文中提出的算法,所以我想我会试着弄明白。

(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

在这一点上,我完成了扩展关系定义,但不知道如何从关系到函数和类型的术语,所以我去找到一个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 ~ ay ~ a 它给出的结果与我描述的结果相同:

for all a, b, x, y
  a (k x y) = k (a x) (b y)

如果我们选择b=a来使两个结果等价。

暂无
暂无

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

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