Недавно я узнал о GADTs
и их обозначения:
например.
data Maybe a where
Nothing :: Maybe a
Just :: a -> Maybe a
data Either a b where
Left :: a -> Either a b
Right :: b -> Either a b
data Bool where
False :: Bool
True :: Bool
Теперь я заметил сходство с функциями, такими как bool
, и either
, который в основном похож на определение GADT
:
- взятие каждой строки в качестве аргумента
- заменив фактический тип следующей буквой алфавита
- и, наконец, возвращает функцию
Type -> (the letter of step 2)
например.
maybe :: b -> (a -> b) -> Maybe a -> b
either :: (a -> c) -> (b -> c) -> Either a b -> c
bool :: a -> a -> Bool -> a
Это также включает foldr
, но я заметил, что, например, У Tuple нет такой функции, хотя вы можете легко определить ее:
tuple :: (a -> b -> c) -> (a,b) -> c
tuple f (x,y) = f x y
Что это за шаблон? Мне кажется, что эти функции облегчают необходимость сопоставления шаблонов (поскольку они дают общий способ для каждого случая), и поэтому каждая функция, работающая над типом, может быть определена в терминах этой функции.