Haskell中的高阶函数

时间:2015-04-03 00:28:39

标签: 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 | ..我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,您的代码从不调用f函数。您的代码中还有其他一些我不理解的内容:

  1. hosum f 0 = 1。为什么它适用于任何f。不应该是f 0吗?

  2. afunction中,为什么结果0如果a == z。如果范围是包含的,则仅在a > z

  3. 时才应为零 afunction案例中的
  4. otherwise会自行调用两次。为什么不将f应用于a并仅拨打afunction f (a + 1) z

  5. 现在关于正确的解决方案。 实现它的最简单(和惯用)方式是使用标准summap函数。它提供了一个单行(如果我们不计算类型签名):

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

    简单地说,此函数会列出从-abs(n)abs(n)的所有数字的列表,对每个数字应用f并对它们进行求和。这正是问题陈述告诉我们要做的事情。

相关问题