[英]higher-order functions in Haskell
我写了以下代码:
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
时才应为零。
otherwise
afunction
调用两次。 为什么不将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
应用于每个数字并将其求和。 这正是问题陈述告诉我们要做的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.