Вы также можете использовать Аппликативы, которые имеют дополнительное преимущество, позволяя вам применять различные функции для каждого элемента кортежа:
import Control.Applicative
mapTuple :: (a -> a') -> (b -> b') -> (a, b) -> (a', b')
mapTuple f g = (,) <$> f . fst <*> g . snd
Встроенная версия:
(\f -> (,) <$> f . fst <*> f . snd) (*2) (3, 4)
или с другой картойфункции и без лямбды:
(,) <$> (*2) . fst <*> (*7) . snd $ (3, 4)
Другая возможность будет использовать стрелки:
import Control.Arrow
(+2) . fst &&& (+2) . snd $ (2, 3)