我如何使用函子或应用程序在元组列表上重写此 Haskell 函数

How can I use functors or applicatives to rewrite this Haskell function over lists of tuples

有没有更好的方法来使用函子或应用程序来编写以下函数fs'

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

我从 看到我可以依赖列表的仿函数实例来映射作用于每个元组的两个元素的单个函数,或者例如在元组的应用实例上将函数仅应用于双元组的后半部分,但我很好奇函子和应用程序如何适应对多组件数据类型列表进行操作的情况。

您需要的是 mapPair 函数,它在 the utility-ht package 中定义,但它只是

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)]

元组是双函子,所以bimap可用。

import Data.Bifunctor

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

不需要第三方库。