【发布时间】:2014-08-15 17:35:14
【问题描述】:
以下问题与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
Q: 是否所有类型的项都是Bool 或Nat 或上述形式的任何其他潜在递归代数数据类型(以这种方式编码),直至操作语义的一些简化规则?
示例 1(自然数): forall t. t -> (t -> t) -> t 类型的任何术语在某种意义上是否与 \ x0 f -> f (f ( ... (f x0) ... )) 形式的术语“等效”? p>
示例 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?
【问题讨论】:
标签: haskell recursion polymorphism semantics