我不太明白为什么会这样:
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}}
我仍然有点困惑,为什么你不能使用唱片糖来扩展记录。
答案 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]) )
由于外排尾部的*
种类而无法检查。