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