2015-04-03 181 views
0

我写了下面的代码:从高阶函数

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 

找到F(I)的总和 - | N | to | n | ..我的错误在哪里?

+7

你永远不会调用'f'。尝试删除类型签名并查看您的函数的GHC类型(f参数将完全是多态的)。 – 2015-04-03 00:50:47

+0

作为@jcast说:你只需要一个更多的''否则''情况下,但手动递归是很好的开始我会建议考虑如何用'map'和'sum'来代替 - ** PS * * hosum是什么?我可以在这里删除它 - 也可以尝试找到更好的函数名称,并举例说明如何调用你的函数 - 这里有点奇怪 – Carsten 2015-04-03 05:27:10

+0

@jcast我不明白你在说什么,只是因为我是一个初学者哈斯克尔...这个练习是为我的班级和我的教授告诉我们,使这个函数从以下开始:hosum ::(Int-> Int) - >(Int-> Int)hosum fn。更清楚的事情将是有益的 – 2015-04-03 08:40:48

回答

1

正如评论中指出的那样,您的代码永远不会调用f函数。您的代码中还有其他一些内容我不明白:

  1. hosum f 0 = 1。为什么它是任何一个f。不应该是f 0

  2. afunction,为什么结果0 if a == z。如果范围是包含的,则只有在a > z的情况下才应该为零。

  3. afunctionotherwise的情况下自己调用两次。为什么不适用fa并且只能拨打afunction 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他们每个人并总结他们向上。这正是问题陈述告诉我们要做的。

+0

此外,如果我有一个函数列表和另一个列表来创建一个新列表,其中一个列表中的每个元素映射到另一个列表的另一个元素,我该怎么办?例如,应用[(^ 2),(^ 3),(^ 4),(2 ^)] [10] = [100,1000,1024,10000]。每个列表的长度可能更大 – 2015-04-03 11:03:09

+0

@您可以使用列表解析。像这样:'[f x | f < - [(2 *),(2+)],x < - [1,2]]'='[2,4,3,4]'。 – kraskevich 2015-04-03 13:50:35