Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
data Ze
data Su n
data Vec :: * -> * -> * where
Nil :: Vec a Ze
Cons :: a -> Vec a n -> Vec a (Su n)
pattern matching — механизм не используется в императивных языках
a имеет какой-то тип, а ещё и содержимое a обладает определённой структурой.a имеет какой-то тип, а ещё и содержимое a обладает определённой структурой
(++) :: [a] -> [a] -> [a] --Функция принимает на вход два списка со зачениями типа a и возвращает список со значениями типа a
[] ++ ys = ys --Этот паттерн описывает, что делает функция, когда она применяется к пустому списку
x:xs ++ ys = x : (xs ++ ys) --А этот паттерн описывает, что делает функция, когда применяется к непустым спискам
Как видим, смогли создать гетерогенный список, несмотря на то, что он гомогенный.Создать-то создали, только что с ним делать? Я бы расширил этот простой пример для понятности, используя ограничение класса типов:
data HeteroData = forall a. Show a => HeteroData a
instance Show HeteroData where
show (HeteroData x) = show x
list = [HeteroData 3.7, HeteroData "message", HeteroData True]
str = show list -- => [3.7,"message",True]
HeteroData — это реально черный ящик, ничего и никак с его значением не сделать. Это сразу наводит на мысли, что что-то нам недорассказали. При дальнейшем поиске я и нашел, что в реальном мире эта фича часто употребляется именно вместе с классами.{-# LANGUAGE TypeOperators #-}
data a +++++ c = D (a,c)
d= D ("s","s")
> :t d
d :: [Char] +++++ [Char]
Зоопарк Алгебрaических Типов Данных