如何将带有2个参数的lambda应用于Haskell中的列表?

时间:2016-04-24 12:50:42

标签: haskell

在Haskell中,我可以使用以下lambda表达式:

\x y -> x * y

并应用它:

(\x y -> x * y) 9 9
81

(\x y -> x * y) 8 8
64

如果我想表达类似的话,“取上面的lambda,并将其映射到列表上,每个项目都是一对值,如上所述,并返回一个列表,每个值都是应用该lambda的结果表达“,我该怎么办?

在伪代码中,我的意思是:取(\x y -> x * y)并将其应用于类似[(9, 9), (8, 8)]的内容。

我知道如果我有\x -> x + 1,我可以执行以下操作:

map (\x -> x + 1) [9, 9, 9]
[10,10,10]

换句话说,我试图找出是否有可能(以及如何)做某事

map (\x y -> x * y) [ a list of items, each being a pair of values, on which the lambda can work ]

显然,以下情况不起作用:

map (\x y -> x * y) [(9, 9), (8, 8)]

它不会返回[81, 64]。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:12)

let list = [(9, 9), (8, 8)]
-- if you want to do it inline
map (\(x, y) -> x * y) list
-- or if you already have a 2 parameter version of a function
let f x y = x * y 
uncurry :: (a -> b -> c) -> ((a, b) -> c)
map (uncurry f) list

\(x, y) -> x * y :: (Int, Int) -> Int\x y -> x * y :: Int -> Int -> Int之间存在差异。

第一个是一个函数,它接受一个参数 - 一个元组并返回乘法的结果。

第二个是一个函数,它接受两个参数并返回乘法结果。