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

124
10

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


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)

спросил(а) 2011-05-06T22:33:00+04:00 8 лет, 7 месяцев назад
2
Решение
79

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

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

ответил(а) 2011-05-06T23:09:00+04:00 8 лет, 7 месяцев назад
Еще 1 ответ
113

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


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

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

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

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


add'em = uncurry' (+)

ответил(а) 2011-05-06T22:39:00+04:00 8 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема