Haskell - 将参数传递给map函数?

时间:2016-09-17 10:21:21

标签: haskell

基本问题...我希望映射列表并将函数应用于每个元素,但是我想从另一个函数执行此操作:

functionOne :: Int -> Int -> Int --Add x to each element of the list
functionOne element x = element + x 

functionTwo :: [Int] -> (Int -> Int -> Int) -> [Int]
functionTwo list fOne = map list fOne ave --map list by applying functionOne with ave as x
   where 
     ave = ((sum list) / length list)

为什么这不起作用?

1 个答案:

答案 0 :(得分:2)

你可能想要这个:

functionTwo :: [Int] -> (Int -> Int -> Int) -> [Int]
functionTwo list fOne = map (\el -> fOne el ave) list
   where 
     ave = sum list `div` length list

上面,我们使用匿名函数(\el -> fOne el ave),它是将每个el映射到fOne el ave的函数。通过这种方式,我们将fOne的第二个参数修改为所需的值。

可替换地,

functionTwo :: [Int] -> (Int -> Int -> Int) -> [Int]
functionTwo list fOne = map (flip fOne ave) list
   where 
     ave = sum list `div` length list

注意整数除法div/仅适用于浮点数。

flip ff的功能相同,但前两个参数的顺序相同。

也可以:map (`fOne` ave) list