在以下代码中,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
答案 0 :(得分:4)
问题不在于value
,而在于future_value
。 future_value
有三个参数,但您只给它一个(value
),因此future_value value
的类型为Float -> Float - > Float
。另一方面,value
只是Float
因为return_over_time
完全应用于where
条款。
您可以通过为future_value
和interest
传入两个以上的浮点数来确保完全应用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都很有意义,迟早你会习惯它并学会修复由于缺少参数而导致的错误。