PureScript中的记录

时间:2015-02-08 16:07:55

标签: records type-kinds purescript

我不太明白为什么会这样:

module Records where

type Element e = { element :: String, label :: String | e }
type Sel = ( value :: Number, values :: [Number] )

type Select = Element Sel

虽然这说Cannot unify # * with *

module Records where

type Element e = { element :: String, label :: String | e }
type Sel = { value :: Number, values :: [Number] }

type Select = Element Sel

(注意Sel右侧的'()'而不是'{}'。)

我在这里forall r. { firstName :: String, lastName :: String | r }去了forall r. Object (firstName :: String, lastName :: String | r) {{1}}

我仍然有点困惑,为什么你不能使用唱片糖来扩展记录。

1 个答案:

答案 0 :(得分:13)

Object 类型构造函数行类型参数化。实物表示法,Object # * -> *。也就是说,它需要一种类型的类型。

( value :: Number, values :: [Number] )表示行类型(某种类型# *),因此可以传递给Object来构造一个类型,即

Object ( value :: Number, values :: [Number] )

请注意{ ... }只是Object类型构造函数的语法糖,所以这与

相同
{ value :: Number, values :: [Number] }

两者都有*种类,因此将此内容作为参数传递给Element是没有意义的,因为e中的类型变量Element有点类型# *

换句话说,你的第二个例子中的Element Sel展开到

{ element :: String, label :: String | { value :: Number, values :: [Number] } }

哪个去了

Object (element :: String, label :: String | Object (value :: Number, values :: [Number]) )

由于外排尾部的*种类而无法检查。