从\ case语句(Haskell)中截断长期计划中的1年期付款

时间:2019-04-25 00:20:52

标签: haskell

我正在尝试构建一个函数,以查看详细记录每月付款金额和剩余每月付款期限的收款记录,以便得出每年的总付款额。

这是我到目前为止所拥有的:

annualizeMonthlyExpense :: MonthlyPayment -> MonthsLeftToPay -> Double -> Double
annualizeMonthlyExpense a b = \case
  (MonthsLeftToPay > 12) -> (AnnualPayment = 12 * MonthlyPayment)
  (MonthsLeftToPay < 12) -> (AnnualPayment = (12 - MonthsLeftToPay) * MonthlyPayment)

我相信从概念上讲,我是对的,但是我的语法肯定不正确。

尤其是,我不仅想知道如何退还该年剩余时间的全部付款,而且还希望将其作为具有年化计算中使用的期数的元组的一部分。

>

1 个答案:

答案 0 :(得分:2)

模式匹配不能这样工作:模式不能是布尔条件,它们必须是数据形状,例如Just xa:b:cRight yLeft Nothing等。

要使用此类布尔条件,请使用函数防护:

annualizeMonthlyExpense a b
  | (MonthsLeftToPay > 12) = (AnnualPayment = 12 * MonthlyPayment)
  | otherwise = (AnnualPayment = (12 - MonthsLeftToPay) * MonthlyPayment)

但这不是您的函数的唯一问题。

例如,变量不能为CamelCased,它们必须以小写字母开头。这意味着MonthsLeftToPayAnnualPayment是无效的变量名称。

从您的类型中,我可以猜到MonthsLeftToPay可能是第二个参数,您将其命名为b。同样,MonthlyPayment可能意味着a。但是我不确定AnnualPayment是什么。

从非理性的语法AnnualPayment = ...来看,我推断也许您是说它是函数的结果?如果是这样,只需将结果写在等号后:

annualizeMonthlyExpense a b
  | b > 12 = 12 * a
  | otherwise = (12 - b) * a

此外,您的类型签名指定了三个参数(MonthlyPaymentMonthsLeftToPayDouble),但是参数列表仅列出了两个。这将无法编译。

如果您打算完全忽略第三个参数,则可以在其下划线使用下划线:

annualizeMonthlyExpense a b _
  | b > 12 = 12 * a
  | otherwise = (12 - b) * a