PureScript 中的记录

Records in 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 右侧的“()”而不是“{}”。)

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

我还是有点疑惑,为什么不能用record-sugar来扩展记录呢

Object类型构造函数行类型参数化。在 kind 表示法中,Objectkind # * -> *。即取一行类型到一个类型。

( value :: Number, values :: [Number] )表示行类型(类似# *的东西),所以可以传给Object构造一个类型,即

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

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

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

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

换句话说,第二个示例中的 Element Sel 展开为

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

脱糖到

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

由于外排尾部有实物*,实物检查失败。