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 表示法中,Object
有 kind # * -> *
。即取一行类型到一个类型。
( 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]) )
由于外排尾部有实物*
,实物检查失败。
我不太明白为什么会这样:
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 表示法中,Object
有 kind # * -> *
。即取一行类型到一个类型。
( 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]) )
由于外排尾部有实物*
,实物检查失败。