Возможно ли совпадение шаблонов в Haskell?

Предоставлено:

data TwoInts = TwoInts Int Int 

add'em :: TwoInts -> Int
add'em (TwoInts a b) = a+b

можно написать add'em, не называя a и b. Что-то вроде:

 add'em TwoInts = (+) -- (Note: Fails to type check)

Ответы

Ответ 1

В общем, я бы сказал, нет, это невозможно. Однако, если вы пытаетесь решить практическую проблему разворачивания и обертывания повсюду (особенно с новыми типами), я часто определяю функцию mapf f (Type val) = Type (f val), аналогичную fmap, а затем не экспортирую ее. Вы можете сделать то же самое для n-арного типа данных, просто передав больше функций. Если реализация не должна быть секретной, вы можете ее экспортировать (как fmap для унарных). Я рекомендую такую ​​функцию отображения или виды для сложных типов, потому что сопоставление шаблонов привяжет вас к реализации.

У базовых типов уже определены такие функции, например. maybe и either.

Ответ 2

По аналогии с кортежами,

data TwoInts = TwoInts { fst', snd' :: Int }

мы можем определить операцию поднятия функций двух аргументов на a TwoInt

uncurry' f p =  f (fst' p) (snd' p)

Давая нам хорошую нотацию:

add'em = uncurry' (+)