Записи в 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 } обессахаривают forall r. Object (firstName :: String, lastName :: String | r)

Я все еще немного сбит с толку, почему вы не можете использовать рекордный сахар для расширения записей.


person Archaeron    schedule 08.02.2015    source источник


Ответы (1)


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] } }

который обессахаривает

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

который не проходит проверку на доброту из-за вида * в хвосте внешнего ряда.

person Phil Freeman    schedule 08.02.2015
comment
большое спасибо. Это все объясняет :) Думаю, было бы неплохо иметь запись о записях в вики. Как то, во что { value :: Number, values :: [Number] } десахаривают. И пример того, как вы могли бы расширить запись, был бы действительно полезен. Еще раз спасибо - person Archaeron; 09.02.2015
comment
Без проблем. Не стесняйтесь скопировать это в вики, если хотите. - person Phil Freeman; 09.02.2015