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函数。您的代码中还有其他一些我不明白的事情:

  1. hosum f 0 = 1为什么它适合任何一个f不是f 0吗?

  2. 在中afunction0如果结果为何a == z如果范围包括在内,则仅当时应为零a > z

  3. afunction在这种otherwise情况下,自称两次。为什么它不适f用于aafunction f (a + 1) z通话

现在介绍正确的解决方案。实现它的最简单(惯用)方法是使用标准summap功能。它提供了一个单线(如果我们不计算类型签名的话):

hosum :: (Int -> Int) -> Int -> Int
hosum f n = sum $ map f [-abs(n)..abs(n)]

用简单的英语来说,此函数将列出从-abs(n)的所有数字,abs(n)应用于f每个数字并将其相加。这正是问题陈述告诉我们要做的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章