使用CPS

时间:2016-12-27 15:39:00

标签: haskell compiler-construction ghc

这四个陈述中的哪一个是假的?

  • newtypedata定义可以由type(->)的{​​{1}}结构取代。
  • forall已正确实施。
  • 即使GADT不存在,
  • RankNTypes也难以正确实施。
  • 前两个陈述反驳第三个。

编辑:我很惊讶,并不清楚。 ImpredicativeTypes可以写成data Maybe = Nothing | Just atype Maybe a = forall b. b -> (a -> b) -> b可以写成data [] a = [] | a : [a]。 (与type [] a = forall b. b -> (a -> b -> b) -> bmaybe比较。)对于所有foldrnewtype定义,同样的事情应该是可能的,并且称为延续传递样式(CPS)。

据我所知,data使用forall扩展名正确实现了具有深层嵌套(->)ghc的类型的类型推断,但是{{ 1}},即使在RankNTypes以外的类型构造函数的参数中允许ImpredicativeTypes,也是绝对无法打破的。

但是,您无法通过将所有forall(->)类型转换为其CPS表单来实施ImpredicativeTypes,使用data机制进行推理,然后转换回newtype / RankNTypes表单?

1 个答案:

答案 0 :(得分:1)

他们都不是。使用ImpredicativeTypes的困难来自于没有类型推断,要求用户提供显式类型签名。您认为,由于RankNTypes被广泛使用,因此类型推断通常适用于RankNTypes,但是not true

  

一般不可能推断出更高等级的类型;在许多情况下,类型注释必须由程序员提供。