在Haskell中计算利息

4

函数式编程对我来说很新,似乎无法理解如何将一个函数用作另一个函数的参数。finalvalue应该在一个周期后计算最终值,finalvalue2则在两个周期后计算最终值。

interest :: Float -> Float -> Float
interest capital rate = capital * rate * 0.01

finalvalue :: Float -> Float -> Float
finalvalue capital rate = capital + interest capital rate

finalvalue2 :: Float -> Float -> Float
finalvalue2 capital rate = finalvalue capital rate + interest finalvalue capital rate rate

I get this:

Couldn't match expected type `Float'
       against inferred type `Float -> Float -> Float'
In the first argument of `interest', namely `finalvalue'
In the second argument of `(+)', namely
    `interest finalvalue capital rate rate'
In the expression:
      finalvalue capital rate + interest finalvalue capital rate rate

我确定我在这里漏了一个基本点,但我就是找不出来是什么。


1
统计您在 interest 中声明的参数数量以及在 finalvalue2 中应用的参数数量。您发现了什么问题吗? - fuz
1
@Nick:$ 在这里不起作用,因为函数调用不是最后一个参数。 - sepp2k
如果他在兴趣函数中交换参数的顺序,那么它将起作用。但是是的,我同意,看看我的答案。 - Nick Brunt
3个回答

7
interest finalvalue capital rate rate

在这里,您使用了四个参数调用interest函数,其中第一个是一个函数。由于interest的第一个参数需要是浮点数而不是函数,因此您会得到错误消息。
您可能想要编写的内容是:interest (finalvalue capital rate) rate,它将使用两个浮点数调用interest函数,其中第一个是使用capitalrate作为参数调用finalvalue函数的结果。

非常感谢!我不知道我应该像那样使用括号。问题解决了。 - Moriz Büsing

4
你只需要加上一些括号,是吗?
finalvalue2 :: Float -> Float -> Float
finalvalue2 capital rate = 
   finalvalue capital rate + interest (finalvalue capital rate) rate

In

finalvalue2 :: Float -> Float -> Float
finalvalue2 capital rate = 
   finalvalue capital rate + interest finalvalue capital rate rate
                                      ^^^^^^^^^^

编译器将finalvalue标记的使用视为interest函数的第一个参数,就好像它是3.23一样,但显然它无法理解这种情况。(建议查看错误报告中提到的确切位置,本例中指的是我标记的地方。)

1
finalvalue2              :: Float -> Float -> Float
finalvalue2 capital rate = finalvalue capital rate + interest (finalvalue capital rate) rate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接