Винил: создайте псевдонимы типа записи
В виниле я могу определить псевдоним типа для записи, чтобы упростить экспорт в другие модули:
import Data.Vinyl
name = Field :: "name" ::: String
age = Field :: "age" ::: Int
type Person = ["name" ::: String, "age" ::: Int]
Теперь предположим, что я добавил еще одно поле для хранения высоты.
height = Field :: "height" ::: Int
Я хотел бы красиво создать псевдоним типа для записи, содержащей Person
а также height
, Наивно, это может выглядеть примерно так:
type MeasuredPerson = ("height" ::: Int) : Person
Этот синтаксис не работает, очевидно! Есть ли способ сделать это? Есть ли хорошие ссылки, которые объясняют синтаксис массива уровня типа, который, кажется, используется здесь?
1 ответ
Решение
Оказывается, есть очень простой ответ на этот вопрос, который мне удалось пропустить:
Data.Vinyl.Rec
определяет и минусы, и добавление для списков уровня типа, поэтому работает следующее:
type MeasuredPerson = ("height" ::: Int) ': Person
Если бы у меня было два списка, я мог бы добавить их следующим образом:
type Other = Person ++ Address