在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]
。有没有办法做到这一点?
答案 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
之间存在差异。
第一个是一个函数,它接受一个参数 - 一个元组并返回乘法的结果。
第二个是一个函数,它接受两个参数并返回乘法结果。