PureScript中的记录

Arc*_*ron 5 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
Run Code Online (Sandbox Code Playgroud)

虽然这样说Cannot unify # * with *.

module Records where

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

type Select = Element Sel
Run Code Online (Sandbox Code Playgroud)

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

我在这里读https://leanpub.com/purescript/read#leanpub-auto-objects-and-rowsforall r. { firstName :: String, lastName :: String | r }desugars到 forall r. Object (firstName :: String, lastName :: String | r)

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

Phi*_*man 13

Object 类型的构造是由参数的类型列.实物符号,Object种类 # * -> *.也就是说,它需要一种类型的类型.

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

Object ( value :: Number, values :: [Number] )
Run Code Online (Sandbox Code Playgroud)

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

{ value :: Number, values :: [Number] }
Run Code Online (Sandbox Code Playgroud)

两者都有种类*,因此将这个东西作为参数传递是没有意义的Element,因为类型变量ein Element有种类# *.

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

{ element :: String, label :: String | { value :: Number, values :: [Number] } }
Run Code Online (Sandbox Code Playgroud)

不好意思

Object (element :: String, label :: String | Object (value :: Number, values :: [Number]) )
Run Code Online (Sandbox Code Playgroud)

由于*外排尾部的那种东西而无法检查.