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

时间:2019-03-22 18:35:17

标签: haskell functor applicative

是否有更好的方法可以使用函子或应用程序来编写以下函数if clause

fs'

我从this question看到,我可以依靠列表的函子实例来映射作用在每个元组的两个元素上的单个函数,例如在元组的应用实例上仅将函数应用于二元组的后半部分,但我很好奇函子和应用程序如何适合对多组分数据类型列表进行操作的图片。

2 个答案:

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