Возможно ли совпадение паттернов в Хаскеле? - PullRequest
15 голосов
/ 06 мая 2011

Дано :

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)

Ответы [ 2 ]

12 голосов
/ 06 мая 2011

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

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

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

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

Дав нам приятную запись:

add'em = uncurry' (+)
5 голосов
/ 07 мая 2011

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

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

...