Как читать определения типов в Elm - PullRequest
0 голосов
/ 31 января 2019

Как мне прочитать определение типа, подобное следующему?

type Config data msg =
  Config
    { toId : data -> String
    , toMsg : State -> msg
    , columns : List (ColumnData data msg)
    , customizations : Customizations data msg
    }

Кажется, в нем есть "повторяющийся" элемент: Конфигурация присутствует на LHS и RHS,

Другой пример:

type State =
  State String Bool

Что сообщают эти объявления типов?

1 Ответ

0 голосов
/ 31 января 2019

В левой части указывается тип, который вы будете создавать.Справа вы определите значения, которые тип может принимать.Может быть только один или сколько угодно.

type MyType = ValueA | ValueB | ValueC

Кроме того, вы можете создавать типы, значения которых содержат дополнительные данные.Это можно сделать, следуя имени значения (формально называемого конструктор данных или вариант в Elm) другим типом.Вы можете использовать любой конкретный тип и иметь любое их количество.Типы и арности (количество аргументов) не должны быть одинаковыми между вариантами.

type MyType = ValueA String | ValueB Int (List String) | ValueC

Все они были конкретными типами.Когда у вас есть значение, оно всегда будет иметь конкретный тип.Предположим, вы хотите создать свой собственный тип пары.Вы можете определить

type PairOfIntAndInt = PairOfIntAndInt Int Int
type PairOfIntAndString = PairOfIntAndString Int String
type PairOfStringAndString = PairOfStringAndString String String
…

, но это будет не очень удобно.По этой причине Elm позволяет вам иметь конструкторы типа (то есть формальное имя имени типа в LHS) с параметрами.Они будут написаны строчными буквами:

type Pair first second = Pair first second

Многие полезные основные функции, такие как Maybe или Result, фактически являются типами, которые принимают параметры.Их также называют абстрактными типами.Чтобы сделать их конкретным типом, вам нужно передать им конкретный тип [^ 1] для каждого параметра.

Теперь давайте посмотрим на ваш код.У вас есть конструктор типа Config, который принимает два параметра.

type Config data msg =

И тип принимает значения, созданные с помощью одного конструктора данных

  Config

, в котором хранится одно значение.Тип значения на самом деле является составным типом, записью.Он ожидает четыре поля, и их типы будут зависеть от параметров конструктора типа.

    { toId : data -> String
    , toMsg : State -> msg
    , columns : List (ColumnData data msg)
    , customizations : Customizations data msg
    }

Например, если у вас есть конкретный тип Config String Int, он будет ожидать следующее значение:

Config
  { toId = someToIdValue
  , toMsg = someToMsgValue
  , columns = someColumnsValue
  , customizations = someCustomizationsValue
}

, где someToIdValue должна быть функцией, принимающей String и возвращающей String, toMsg функцию от State до Int и т. Д.

Длядополнительную информацию см. https://guide.elm -lang.org / types / custom_types.html

[^ 1]: некоторые языки, такие как Haskell, на самом деле допускают более дикие типы.https://wiki.haskell.org/Kind

...