2015-02-08 40 views
3

我不明白爲什麼這個工程:記錄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-rowsforall r. { firstName :: String, lastName :: String | r } desugars讀 forall r. Object (firstName :: String, lastName :: String | r)

我仍然有點困惑,爲什麼你不能使用記錄糖來擴展記錄。

回答

11

Object類型構造行的類型參數化。實物標註Object# * -> *。也就是說,它需要一行類型到一個類型。

(value :: Number, values :: [Number])表示行類型(什麼樣的# *),因此它可以被傳遞到Object構造類型,即

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

注意{ ... }只是爲對象類型語法糖構造函數,所以這是一樣的

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

兩個都有種*,所以它沒有任何意義傳遞這個東西作爲Element的一個參數,因爲Element中的類型變量e有種類# *

換句話說,Element Sel在你的第二個例子解開來

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

這desugars到

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

從而未能樣的檢查由於種*中的尾部事外排。

+0

非常感謝。這解釋了一切:) 我認爲這將是非常好的關於維基中的記錄的條目。 就像'{value :: Number,values :: [Number]}'一樣。而一個例子你將如何擴展記錄將是非常有用的。 再次感謝 – Archaeron 2015-02-08 22:37:06

+0

沒問題。如果您願意,可以隨意將其複製到wiki上。 – 2015-02-09 19:15:45