2015-02-08 4 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-rows что forall 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, так как переменная типа e в Element имеет вид # *.

Другими словами, 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]}' desugars. И пример того, как вы продлеваете запись, будет действительно полезен. Еще раз спасибо – Archaeron

+0

Нет проблем. Не стесняйтесь копировать это на wiki, если хотите. –