以下问题与Recursive algebraic data types via polymorphism in Haskell有关。
递归代数数据类型可以使用通用参数多态在具有System F功能的任何语言中实现。例如,自然数的类型可以作为
引入(在Haskell中)newtype Nat = Nat { runNat :: forall t. (t -> (t -> t) -> t) }
通常'自然数n
被实现为
\ x0 f -> f(f(...(f x0)...))
使用了n
次f
次迭代。
同样,布尔的类型可以作为
引入newtype Bool = Bool { runBool :: forall t. t -> t -> t }
预期值' true'并且' false'被实现为
true = \ t f -> t
false = \ t f -> f
问:类型Bool
或Nat
的所有术语或上述形式的任何其他潜在递归代数数据类型(以这种方式编码),都可以减少一些操作语义规则?
示例1(自然数):类似forall t. t -> (t -> t) -> t
'等同的任何术语'在某种意义上,对于\ x0 f -> f (f ( ... (f x0) ... ))
形式的术语?
示例2(布尔值):类似forall t. t -> t -> t
'等同的任何术语'在某种意义上,\ t f -> t
或\ t f -> f
?
附录(内部版本):如果所考虑的语言甚至能够表达命题平等,这个元数学问题可以内化如下,如果有人愿意,我会很高兴想出一个解决方案:
对于任何仿函数m
,我们可以在其上定义通用模块和一些解码编码功能,如下所示:
type ModStr m t = m t -> t
UnivMod m = UnivMod { univProp :: forall t. (ModStr m t) -> t }
classifyingMap :: forall m. forall t. (ModStr m t) -> (UnivMod m -> t)
classifyingMap f = \ x -> (univProp x) f
univModStr :: (Functor m) => ModStr m (UnivMod m)
univModStr = \ f -> UnivMod $ \ g -> g (fmap (classifyingMap g) f)
dec_enc :: (Functor m) => UnivMod m -> UnivMod m
dec_enc x = (univProp x) univModStr
问:如果语言能够表达:是否存在等同类型dec_enc = id
?
答案 0 :(得分:4)
如果我们忽略了底部和unsafe
的东西,那么你可以用函数a -> a
普遍做的就是组合它们。但是,这并不能完全阻止我们使用有限的f (f ( ... (f x0) ... ))
表达式:我们也有无限的组合infty x f = f $ infty x f
。
同样,唯一的非递归布尔值确实是\t _ -> t
和\_ f -> f
,但你也可以在这里打结,比如
blarg t f = blarg (blarg t f) (blarg f t)
答案 1 :(得分:4)
在系统F(AKAλ2)中,∀α.α→α→α
的所有居民确实λ等于K
或K*
。
首先,如果M : ∀α.α→α→α
那么它具有正常形式N
(因为系统F正常化)和主题缩减定理(参见Barendregt: Lambda calculi with types)也N : ∀α.α→α→α
。
让我们来看看这些正常形式的外观。 (我们将使用生成引理用于λ2,请参阅Barendregt的书以获取正式细节。)
如果N
是普通表单,则N
(或其任何子表达式)必须采用头部正常形式,即λx1 ... xn. y P1 ... Pk
形式的表达式,其中{{1} }和/或n
也可以是0。
对于k
的情况,必须至少有一个λ,因为最初我们在输入上下文中没有任何变量绑定代替N
。所以y
和N = λx.U
。
现在,x:α |- U:α→α
的情况下必须至少有一个λ,因为如果U
只是U
,那么y P1 ... Pk
会有一个函数类型(即使对于y
k = 0我们需要y:α→α
),但我们在上下文中只有x:α
。所以N = λxy.V
和x:α, y:α |- V:α
。
但V
不能是λ..
,因为它有函数类型τ→σ
。因此V
必须只是z P1 ... Pk
形式,但由于我们在上下文中没有任何函数类型变量,k
必须为0,因此V
可以仅限x
或y
。
因此,∀α.α→α→α
类型的正常形式只有两个字词:λxy.x
和λxy.y
,此类型的所有其他字词都等于其中之一。
使用类似的推理,我们可以证明∀α.α→(α→α)→α
的所有居民都与教会数字相等。 (我认为对于类型∀α.(α→α)→α→α
,情况稍微更糟;我们还需要η-相等,因为λf.f
和λfx.fx
对应1
,但不是β -equal,只是βη-相等。)