我一直收到这个错误,我无法理解为什么
sumSquares a = map (^2) a . foldr (+) 0
我将数字列表的方块加起来。
答案 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
和(.)