Haskell 使用CPS将不确定类型减少为RankNTypes
这四种说法中哪一种是错误的Haskell 使用CPS将不确定类型减少为RankNTypes,haskell,compiler-construction,ghc,Haskell,Compiler Construction,Ghc,这四种说法中哪一种是错误的 新类型和数据的定义可以被类型的(>)和结构所取代 RankNTypes正确实施 ImpredicativeTypes即使不存在GADT,也很难正确实现 前两种说法反驳了第三种说法 编辑:我很惊讶这还不清楚数据可能=无|只有a可以写为类型可能a=全部b。b->(a->b)->b数据[]a=[]|a:[a]可以写成类型[]a=forall b。b->(a->b->b)->b。(与maybe和foldr相比),对于所有newtype和数据定义,都应该可以实现相同的功能
和新类型
的定义可以被数据
的类型
和(>)
结构所取代
正确实施RankNTypes
即使不存在GADT,也很难正确实现ImpredicativeTypes
- 前两种说法反驳了第三种说法
编辑:我很惊讶这还不清楚<代码>数据可能=无|只有a可以写为
类型可能a=全部b。b->(a->b)->b
<代码>数据[]a=[]|a:[a]可以写成类型[]a=forall b。b->(a->b->b)->b
。(与maybe
和foldr
相比),对于所有newtype
和数据
定义,都应该可以实现相同的功能,称为连续传递样式(continuation passing style,CPS)
据我所知,使用RankNTypes
扩展名ghc
可以正确地实现对所有和(>)
进行深度嵌套的类型的类型推断,但是不可指示类型
,它允许对所有进行操作,即使在类型构造函数的参数中,而不是(>)
,它坏得无可救药
但是你不能通过将所有的数据
和newtype
类型转换为它们的CPS形式,使用RankNTypes
机器进行推理,然后再转换回数据
/newtype
形式,来实现非指定类型
。使用ImpredicativeTypes
的困难在于没有类型推断,需要用户提供显式类型签名。您假设由于RankNTypes
被广泛使用,因此类型推断通常适用于RankNTypes
,但这是:
一般来说,不可能推断出更高等级的类型;在许多情况下,类型注释必须由程序员提供
也许值得在声明4上再扩展一点。嗯。。。这些陈述来自哪里?如果没有适当的上下文,要回答这些问题是很困难的,如果不是不可能的话。。。ImpredicativeTypes现在没有正确实现,以前也没有。我想我听说RankN完整类型推断是不可判定的(Rank2已经是了,IIRC,但我没有引用)。GHC实现RankN,但依赖用户用其多类型对每个多类型变量进行注释。它不是全自动的。(如果您看到“correct”中包含的“includescomplete type conference”,则2为false。如果不是,则3为false。)