Мы можем использовать синоним типа для определений функций, например
type FuncDef = Int -> Int -> Int
Это позволяет нам не писать каждый раз длинное определение функции.
Используйте:
someFunc :: FuncDef -> Int
Вместо
someFunc :: (Int -> Int -> Int) -> Int
, который более читабелен и содержит меньше кода.
Простые алгебраические типы данных просты и легко поддаются сопоставлению с образцом и т. Д., Например
data AType = X | Y | Z Int
matchType :: AType -> Bool
matchType X = ..
matchType Y = ..
matchType (Z _) = ..
По мере изучения типов данных Haskell я обнаружил, что мы можем иметь определение функции в конструкторе данных при определении нового типа.
data MyType a b = X | Y (a -> b)
Это меня немного озадачивает, и я не видел много подобных примеров. В некотором смысле идея функции высокого порядка, в которой функция может принимать другую функцию в качестве аргумента, аналогична этой ситуации, за исключением того, что здесь она применяется к типу данных. Вики Haskell не очень много говорит об «определении типа данных высокого порядка». Я понимаю, что, возможно, неправильно понимаю все эти термины, поэтому, пожалуйста, поправьте меня и укажите на дополнительную литературу. Я действительно хочу увидеть конкретное использование этого. Спасибо!
matchMyType :: (MyType a b) -> Bool
matchMyType X = ..
matchMyType Y ?? = ..