В левой части указывается тип, который вы будете создавать.Справа вы определите значения, которые тип может принимать.Может быть только один или сколько угодно.
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