我有点不在意了。我一直在使用高阶函数,并且试图应用一个函数并使用(。)组合函数。我正在尝试编写将函数(第一个参数)应用于列表中的每个元素(第二个参数)并求和结果的函数总计。
为我提供了一个特定的类型定义(不应该更改),我试图将功能map
f
到列表,然后sum
返回列表。
total :: (Int -> Int) -> [Int] -> Int
total f x = sum x . map f x
我应该得到一个整数,即总数的sum
。我收到一个错误,但这是我不熟悉的错误:
* Couldn't match expected type `Int' with actual type `[Int] -> c0'
* Probable cause: `(.)' is applied to too few arguments
In the expression: sum x . map f
In an equation for `total': total f x = sum x . map f
我需要方向。我不明白为什么将.
应用于更多参数。
答案 0 :(得分:4)
map
已完全应用,因此您不应在此处使用合成。
使用应用程序运算符
total f x = sum x $ map f x
或者,如果sum
不需要x
,则可以忽略该函数的显式参数,而改为使用composition
total f = sum . map f
复合运算符期望有一个函数,但是您要完全应用map
并将该运算符传递给map
返回的列表。
(我不熟悉虽然会与列表一起接受int的sum函数。这也是错误吗?)