Пример определения функции в конструкторе данных нового типа

Мы можем использовать синоним типа для определений функций, например

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 ?? = .. 
8
задан vis 14 December 2011 в 16:11
поделиться