Возможно ли совпадение шаблонов в 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)
В общем, я бы сказал, нет, это невозможно. Однако, если вы пытаетесь решить практическую проблему разворачивания и обертывания повсюду (особенно с новыми типами), я часто определяю функцию mapf f (Type val) = Type (f val)
, аналогичную fmap, а затем не экспортирую ее. Вы можете сделать то же самое для n-арного типа данных, просто передав больше функций. Если реализация не должна быть секретной, вы можете ее экспортировать (как fmap для унарных). Я рекомендую такую функцию отображения или виды для сложных типов, потому что сопоставление шаблонов привяжет вас к реализации.
У базовых типов уже определены такие функции, например. maybe
и either
.
По аналогии с кортежами,
data TwoInts = TwoInts { fst', snd' :: Int }
мы можем определить операцию поднятия функций двух аргументов на a TwoInt
uncurry' f p = f (fst' p) (snd' p)
Давая нам хорошую нотацию:
add'em = uncurry' (+)