这四个陈述中的哪一个是假的?
newtype
和data
定义可以由type
和(->)
的{{1}}结构取代。forall
已正确实施。RankNTypes
也难以正确实施。编辑:我很惊讶,并不清楚。 ImpredicativeTypes
可以写成data Maybe = Nothing | Just a
。 type Maybe a = forall b. b -> (a -> b) -> b
可以写成data [] a = [] | a : [a]
。 (与type [] a = forall b. b -> (a -> b -> b) -> b
和maybe
比较。)对于所有foldr
和newtype
定义,同样的事情应该是可能的,并且称为延续传递样式(CPS)。
据我所知,data
使用forall
扩展名正确实现了具有深层嵌套(->)
和ghc
的类型的类型推断,但是{{ 1}},即使在RankNTypes
以外的类型构造函数的参数中允许ImpredicativeTypes
,也是绝对无法打破的。
但是,您无法通过将所有forall
和(->)
类型转换为其CPS表单来实施ImpredicativeTypes
,使用data
机制进行推理,然后转换回newtype
/ RankNTypes
表单?
答案 0 :(得分:1)
他们都不是。使用ImpredicativeTypes
的困难来自于没有类型推断,要求用户提供显式类型签名。您认为,由于RankNTypes
被广泛使用,因此类型推断通常适用于RankNTypes
,但是not true:
一般不可能推断出更高等级的类型;在许多情况下,类型注释必须由程序员提供。