5

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

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-rowsforall r. { firstName :: String, lastName :: String | r }去糖 forall r. Object (firstName :: String, lastName :: String | r)

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

4

1 回答 1

13

Object 类型构造函数由一行类型参数化。在 kind 表示法中,Objectkind # * -> *。也就是说,一个类型需要一行类型。

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

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

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

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

两者都有 kind *,因此将这个东西作为参数传递给 没有意义Element,因为类型变量einElement有 kind # *

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

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

哪个脱糖

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

*由于外排尾部有实物,无法进行实物检查。

于 2015-02-08T19:49:42.237 回答