簡體   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