Как я могу использовать функторы или аппликативы, чтобы переписать эту функцию Haskell над списками кортежей - PullRequest
1 голос
/ 22 марта 2019

Есть ли лучший способ написать следующую функцию fs' с функторами или аппликативами?

fncnB = (* 2)
fncnA = (* 3)
fs' fs = zip (map (fncnA . fst) fs) $ map (fncnB . snd) fs

Я вижу из этого вопроса , что я мог бы положиться на экземпляр функторасписки для отображения одной функции, действующей на оба элемента каждого кортежа, или, например, на аппликативный экземпляр кортежа для применения функций только ко второй половине двухкортежа, но мне интересно, как функторы и аппликаторы вписываются в картинуработы со списками многокомпонентных типов данных.

Ответы [ 2 ]

10 голосов
/ 22 марта 2019

Кортеж является бифунктором, поэтому доступно bimap.

import Data.Bifunctor

fncnB = (* 2)
fncnA = (* 3)
fs' = map (bimap fncnA fncnB)

Сторонние библиотеки не требуются.

0 голосов
/ 22 марта 2019

вам нужна функция mapPair, она определена в пакете утилит-ht , но просто

mapPair :: (a -> c, b -> d) -> (a,b) -> (c,d)
mapPair (f,g) (a,b) = (f a, g b) 

используется

Prelude> mapPair ((* 2), (* 3)) (2,3)
(4,9)

или

Prelude> map (mapPair ((* 2), (* 3))) [(1,2),(2,3)]
[(2,6),(4,9)]
...