【发布时间】:2016-02-12 22:10:01
【问题描述】:
我想在 Haskell 的多态 lambda 演算中实现 Church encoding of the pair。
在第 77 页,Peter Selinger's notes on lambda calculus 的第 8.3.3 节,他给出了两种类型的笛卡尔积的构造
A×B = ∀α.(A→B→α)→α
⟨M,N⟩ = Λα.λfA→B→α.fMN
对于另一个来源,在第 54 页,Dider Rémy's notes on lambda calculus 的第 4.2.3 节,他将多态 λ-演算/系统 F 中对的 Church 编码定义为
Λα₁.Λα₂.λx₁:α₁.λx₂:α₂.Λβ.λy:α₁→α₂→β。 y x₁ x₂
我认为 Rémy 说的和 Selinger 一样,只是更冗长。
无论如何,根据维基百科,Haskell 的类型系统是基于System F,所以我希望可以直接在 Haskell 中实现这种 Church 编码。我有:
pair :: a->b->(a->b->c)->c
pair x y f = f x y
但我不确定如何进行预测。
Λα.Λβ.λpα×β.pα(λxα.λyβ.x)
我是否使用 Haskell forall 作为大写 lambda 类型量词?
这与my previous question 基本相同,但使用的是 Haskell 而不是 Swift。我认为额外的背景和场地的变化可能会使它更明智。
【问题讨论】:
-
$$ 美元符号分隔的句子不会调用 Stackoverflow 上的乳胶渲染器吗?
-
不幸的是,他们没有:-(我猜围绕 SO 没有足够的数学计算(除了 Haskell 标签 ;-))
-
a和b在 Haskell 语法中的类型是forall c . (a->b->c) -> c。所以 fst 和 snd 的类型是(forall c . (a->b->c) -> c) -> a和(forall c . (a->b->c) -> c) -> b。从它们的类型签名来看,它们的定义非常简单。 -
This blog post by Jonathon Sterling 似乎在 Haskell 中执行类似教堂编码的操作,请注意他确实使用了
Rank2Types。但我无法遵循所有 Haskell 位。 Antal 在下面的回答将其保持在最低限度。
标签: haskell functional-programming polymorphism lambda-calculus church-encoding