我写了下面的代码:
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 | ..我的错误在哪里?
正如注释中指出的那样,您的代码从不调用该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
每个数字并将其相加。这正是问题陈述告诉我们要做的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句