我正在尝试构建一个函数,以查看详细记录每月付款金额和剩余每月付款期限的收款记录,以便得出每年的总付款额。
这是我到目前为止所拥有的:
annualizeMonthlyExpense :: MonthlyPayment -> MonthsLeftToPay -> Double -> Double
annualizeMonthlyExpense a b = \case
(MonthsLeftToPay > 12) -> (AnnualPayment = 12 * MonthlyPayment)
(MonthsLeftToPay < 12) -> (AnnualPayment = (12 - MonthsLeftToPay) * MonthlyPayment)
我相信从概念上讲,我是对的,但是我的语法肯定不正确。
尤其是,我不仅想知道如何退还该年剩余时间的全部付款,而且还希望将其作为具有年化计算中使用的期数的元组的一部分。
>答案 0 :(得分:2)
模式匹配不能这样工作:模式不能是布尔条件,它们必须是数据形状,例如Just x
或a:b:c
或Right y
或Left Nothing
等。
要使用此类布尔条件,请使用函数防护:
annualizeMonthlyExpense a b
| (MonthsLeftToPay > 12) = (AnnualPayment = 12 * MonthlyPayment)
| otherwise = (AnnualPayment = (12 - MonthsLeftToPay) * MonthlyPayment)
但这不是您的函数的唯一问题。
例如,变量不能为CamelCased
,它们必须以小写字母开头。这意味着MonthsLeftToPay
或AnnualPayment
是无效的变量名称。
从您的类型中,我可以猜到MonthsLeftToPay
可能是第二个参数,您将其命名为b
。同样,MonthlyPayment
可能意味着a
。但是我不确定AnnualPayment
是什么。
从非理性的语法AnnualPayment = ...
来看,我推断也许您是说它是函数的结果?如果是这样,只需将结果写在等号后:
annualizeMonthlyExpense a b
| b > 12 = 12 * a
| otherwise = (12 - b) * a
此外,您的类型签名指定了三个参数(MonthlyPayment
,MonthsLeftToPay
和Double
),但是参数列表仅列出了两个。这将无法编译。
如果您打算完全忽略第三个参数,则可以在其下划线使用下划线:
annualizeMonthlyExpense a b _
| b > 12 = 12 * a
| otherwise = (12 - b) * a