Как называется эта конструкция вяза: type X = X {...}? - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь понять эту конструкцию Вяза:

type Item = Item { name : String, data : String }
  • Она похожа на запись, но ведет себя совсем по-другому.
  • Это полезно для определения рекурсивных моделей данных.
  • В отличие от type alias Item = {...}, он не предоставляет «конструктор».
  • Я не могу найти его в руководствах по синтаксису вяза.
  • Я не могу понять, как получить доступ к его полям:
> item = Item { name = "abc", data  = "def" } 
Item { name = "abc", data = "def" } : Repl.Item

> item.name
-- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm

`item` does not have a field named `name`.

6|   item.name
     ^^^^^^^^^ The type of `item` is:

    Item

Which does not contain a field named `name`.
  • Как называется эта конструкция?
  • Как получить доступ к содержащимся полям?

1 Ответ

0 голосов
/ 29 мая 2018

Это Тип объединения с одним конструктором, который принимает Запись в качестве единственного параметра типа.

Тот факт, что имя типа и конструкторИмена обоих Item являются обычной идиомой, но не имеет значения.Это может быть любое другое допустимое имя конструктора:

type Item = Foo { name : String, data : String }

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

type alias ItemContents = { name : String, data : String }

type Item = Item ItemContents

Вы можете предоставить функцию, которая возвращает внутреннее содержимое:

getItemContents : Item -> ItemContents
getItemContents (Item contents) = contents

И теперь ее можно использовать, как в этом примере REPL:

> item = Item { name = "abc", data  = "def" }
Item { name = "abc", data = "def" } : Repl.Item
> contents = getItemContents item
{ name = "abc", data = "def" } : Repl.ItemContents
> contents.name
"abc" : String
...