如何确保功能完全应用?

时间:2012-02-16 04:11:32

标签: haskell

在以下代码中,where value=子句返回部分应用的函数。

如何确保完全应用?

------------------------------
future_value :: Float -> Float -> Float -> Float
future_value present interest periods =
  (present * (( 1 + interest) ** periods))

------------------------------
-- Given an initial amount
-- Given a yearly fee, as well as a yearly interest...
-- Calculates return over a number of years, given a yearly fee.
return_over_time :: Float -> Float -> Float -> Float -> Float
return_over_time present interest num_years fee =
  if num_years == 1 then (future_value  present interest 1.0) - fee
  else future_value value
       where value =  return_over_time present interest (num_years - 1) fee

2 个答案:

答案 0 :(得分:4)

问题不在于value,而在于future_valuefuture_value有三个参数,但您只给它一个(value),因此future_value value的类型为Float -> Float - > Float。另一方面,value只是Float因为return_over_time完全应用于where条款。

您可以通过为future_valueinterest传入两个以上的浮点数来确保完全应用periods

顺便提一下,您使用Float代替Double是否有任何特殊原因?

答案 1 :(得分:1)

如果一个函数被部分应用是没有意义的,你可以改变它来取一个元组:

future_value :: (Float, Float, Float) -> Float
future_value (present, interest, periods) =
   (present * (( 1 + interest) ** periods))

使用此定义错误消息会更加“本地化”,编译器会抱怨传递(Float, Float)而不是(Float,Float,Float)左右,而不是想要丢失Show之类的内容(->)的实例。然而,对于初学者来说这只是一个小技巧,因为大多数函数currying都很有意义,迟早你会习惯它并学会修复由于缺少参数而导致的错误。