基本问题...我希望映射列表并将函数应用于每个元素,但是我想从另一个函数执行此操作:
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)
为什么这不起作用?
答案 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 f
与f
的功能相同,但前两个参数的顺序相同。
也可以:map (`fOne` ave) list
。