我写了以下代码:
hosum :: (Int->Int)->(Int->Int)
hosum f 0 = 1
hosum f n = afunction f (-abs(n)) (abs(n))
afunction :: (Int->Int)->Int->Int->Int
afunction f a z
|a==z
= 0
|otherwise
= afunction f (a+1) z + afunction f a z
从 - | n |中找到f(i)的总和到| n | ..我的错误在哪里?
答案 0 :(得分:1)
正如评论中所指出的,您的代码从不调用f
函数。您的代码中还有其他一些我不理解的内容:
hosum f 0 = 1
。为什么它适用于任何f
。不应该是f 0
吗?
在afunction
中,为什么结果0
如果a == z
。如果范围是包含的,则仅在a > z
。
afunction
案例中的 otherwise
会自行调用两次。为什么不将f
应用于a
并仅拨打afunction f (a + 1) z
?
现在关于正确的解决方案。
实现它的最简单(和惯用)方式是使用标准sum
和map
函数。它提供了一个单行(如果我们不计算类型签名):
hosum :: (Int -> Int) -> Int -> Int
hosum f n = sum $ map f [-abs(n)..abs(n)]
简单地说,此函数会列出从-abs(n)
到abs(n)
的所有数字的列表,对每个数字应用f
并对它们进行求和。这正是问题陈述告诉我们要做的事情。