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 型コンストラクターは、型の行によってパラメーター化されます。種類表記でObject種類 # * -> *あり。つまり、型の行を型に取ります。

( value :: Number, values :: [Number] )は型の(ある種のもの# *) を示すため、 に渡して型を構築できますObject。つまり、

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

{ ... }これは Object 型コンストラクターの構文糖衣にすぎないことに注意してください。

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

どちらも kindを持っているので、 の型変数が kindを持っているので*、これを引数として に渡すのは意味がありません。ElementeElement# *

別の言い方Element Selをすれば、あなたの2番目の例では展開します

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

脱糖するもの

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

*外側の行の末尾に種類があるため、種類チェックに失敗します。

于 2015-02-08T19:49:42.237 に答える