Skip to content

Instantly share code, notes, and snippets.

@SergProduction
Last active July 20, 2018 21:11
Show Gist options
  • Save SergProduction/17a3b90af6cb19b374a2dfa8ab443053 to your computer and use it in GitHub Desktop.
Save SergProduction/17a3b90af6cb19b374a2dfa8ab443053 to your computer and use it in GitHub Desktop.

Введение

Конктруктор - являеться значением. Им можно оперировать в программе как любым дригим значением, Например как строкой или числом

Тип - работает так же как и в других языках

Основы

data 'тип' = 'конструктор' - Единичный тип. Тип сосоящий из одного конструктора

  • Объявление

    • data A = A
    • data A = B

    Пространство имён типов не пересекается с пространством имён конструкторов,
    поэтому конструктор можно называть так же как и тип.
    В дальнейшем чтении не путать имена типов и имена конструторов * 1

  • Использование

    Единичные типы данных не дают ничего, кроме знания о том, что он есть.
    Из распространённых типов данных используются

    • data () = ()
    • data Unit = Unit

data 'тип' = 'конструктор' 'параметр' ['может быть сколько угодно параметров']

  • Объявление

    При объявлении мы указываем 'конструктор' 'тип'.
    В параметре конcтруктора указываеться тип значения которое он может принимать

    • data A = A Int
    • data B = B String
    • data С = С Int String
    • data D = D A B
      • конcтруктор D применяеться к типу A который состоит из конструктора A Int,
        и к типу B который состоит из конструктора B String. см. * 1
  • Использование

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

    • A 10
    • B "СТРОКА"
    • C 10 "СТРОКА"
    • D (A 10) (B "СТРОКА")

Полиморфизм

data 'тип' 'общий_тип' = 'конструктор' 'общий_тип'

  • Объявление

    Mожно не ограничеваться только примитивными значениями и конструкторами
    при объявлении типа конструктора.
    для этого следует передавать общий тип.
    Общий тип сам по себе конструктор не может принимать, его нужно передавать через тип

    • data A a = A a
    • data A a b = A a b
  • Использование

    • A 10
    • A "СТРОКА"
    • B 10 "СТРОКА"

Сумма типов

  • data Bool = False | True

  • data ABC = A | B | C

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

Произведение типов

  • data Pair a b = Pair a b

  • data Triple a b c = Triple a b c

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

Комбинируем все

  • data Maybe a = Nothing | Just a

    теперь мы можем комбинировать суммы типов с произведением, и получать более сложные типы

Рекурсивные типы данных

  • data List a = Nil | Cons a (List a)

еще есть

  • Записи
  • Вставки или Враперы
  • Степенные типы данных
  • Фантомные типы данных
  • Экзистенциальные типы данных
  • Обобщённые Алгебраические Типы Данных (GADTs)
  • Параметрические типы данных с ограниченными параметрами
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment