是否有更好的方法可以使用函子或应用程序来编写以下函数if clause
?
fs'
我从this question看到,我可以依靠列表的函子实例来映射作用在每个元组的两个元素上的单个函数,例如在元组的应用实例上仅将函数应用于二元组的后半部分,但我很好奇函子和应用程序如何适合对多组分数据类型列表进行操作的图片。
答案 0 :(得分:10)
元组是bifunctor,因此bimap
可用。
import Data.Bifunctor
fncnB = (* 2)
fncnA = (* 3)
fs' = map (bimap fncnA fncnB)
不需要第三方库。
答案 1 :(得分:0)
您需要的是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)]