haskell错误:map应用于太多参数

时间:2014-01-15 17:18:26

标签: haskell map fold

我一直收到这个错误,我无法理解为什么

sumSquares a = map (^2) a . foldr (+) 0

我将数字列表的方块加起来。

2 个答案:

答案 0 :(得分:5)

.是函数组合,所以你所说的是,使用函数foldr (+) 0 :: [Int] -> Int并将其与map (^2) a :: [Int]组合,但这没有意义,你的第二个“函数”这个构成并不是真正的功能。

您是否想要交换它们并使用应用程序,而不是合成

 foldr (+) 0 (map (^2) a)
 foldr (+) 0 $ map (^2) a

这可以转换成具有所谓的“eta转换”的组合

 sumSquares = foldr (+) 0 . map (^2)
 sumSquares = sum . map (^2)

顺便说一下,foldr可能是错误的折叠,foldl'会更节省空间。

答案 1 :(得分:3)

您希望实际执行此操作:

sumSquares a = foldr (+) 0 $ map (^2) a 

ghci中的演示:

ghci> sumSquares [2,2]
8

要使用(.)运算符解决此问题,您可以使用@Sassa提到的解决方案:

sumSquares = foldr (+) 0 . map (^2)

但我发现难以阅读,或者你可以看到他使用sum(.)

的jozefg解决方案