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