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 B 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