Представление одного из конечного множества состояний.

Тип объединения — это тип, который вы определяете.

type Fruit

В нашей маленькой вселенной, которую мы создаем, Fruit — это такой же тип, как Int, Float, Bool и т. д. Вы используете вновь созданный тип в сигнатурах типов, как если бы вы использовали Int, Float, Bool и т. д.

Вы явно определяете, что может относиться к вашему новому типу.

type Fruit
    = Apple
    | Orange
    | Banana

В нашей вселенной мы делаем яблоко, апельсин и банан фруктами. Эти три вещи относятся только к типу Фруктов, и только эти три относятся к типу Фруктов.

Сам никогда не видел ничего подобного Union Types, даже после объяснений все было очень запутанно. Это был мой главный затянувшийся вопрос.

Яблоко, апельсин или банан — это тип?

Нет, технически это значения типа Fruit, но я думаю о Apple, Orange и Banana как о конкретных вещах. Яблоко есть яблоко. Если вы хотите записать свой любимый фрукт, сделайте это так.

favoriteFruit : Fruit  -- your favorite fruit is of type fruit
favoriteFruit = Apple  -- Apple is your favorite fruit

Bool — это союзный тип!

type Bool
    = True
    | False

И True, и False являются Bools, и только True и False являются Bools.

Почему это полезно?

Это помогает операторам case точно знать, для чего выполняется сопоставление с образцом, чтобы вы могли узнать, не учли ли вы все.

Возьмите этот пример.

type Direction
    = North
    | East
    | South
    | West
move: Direction -> Player -> Player
move direction player =
    case direction of
        North -> 
            -- go north
        East -> 
            -- go east
        South ->
            -- go south
        West ->
            -- go west

Если вы не учитываете все четыре направления, Elm поможет вам, сообщив, что вам нужно.

Это делает рефакторинг потрясающим!

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

type Direction
    = North
    | NorthEast
    | East
    | SouthEast
    | South
    | SouthWest
    | West
    | NorthWest

Оттуда компилятор сообщит нам, какие случаи мы не учли, пока мы не учли все 8.

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

Это основа Union Types, но использование может выходить за рамки этого. Union Types могут даже принимать параметры! Но это тема для другого поста.

Этот пост спонсируется бабушкой Смит.