Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用CPS将不确定类型减少为RankNTypes_Haskell_Compiler Construction_Ghc - Fatal编程技术网

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
    正确实施
  • ImpredicativeTypes
    即使不存在GADT,也很难正确实现
  • 前两种说法反驳了第三种说法

编辑:我很惊讶这还不清楚<代码>数据可能=无|只有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。)