【发布时间】:2016-01-26 16:33:12
【问题描述】:
所以我有一个如下定义的 Database.Persist.TH 模型:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Transaction json
date Day
payee String
categoryId Int
memo String
outflow Double
inflow Double
deriving Show Generic
|]
我正在尝试编写一个函数来计算给定[Transaction] 的帐户余额。
到目前为止,我已经推断出以下几点:
calculateBalance :: [Transaction] -> Transaction -> Double
calculateBalance [Transaction{..}] = foldr(\x -> transactionInflow - transactionOutflow) (+)
这就是说,我认为,我们正在使用 foldr 获取交易列表 - 这意味着该列表将“解构”每个单独的交易,减法将在两个双精度之间执行,Double 将被退回。
但是,我正在做的事情似乎是错误的。
这样的一个错误是:
Couldn't match type ‘Transaction’ with ‘t0 a0’
Expected type: Transaction -> Double
Actual type: t0 a0 -> Double
In the expression:
foldr (\ x -> transactionInflow - transactionOutflow) (+)
In an equation for ‘calculateBalance’:
calculateBalance [Transaction {..}]
= foldr (\ x -> transactionInflow - transactionOutflow) (+)
然而,更改 calculateBalance :: [Transaction] -> t0 Transaction -> Double 似乎并不能解决问题,calculateBalance :: [Transaction] -> Transaction -> t0 Transaction -> Double 也不能解决问题,所以我对如何继续感到有些困惑。
我可能做错了什么?任何其他制作这个“惯用”Haskell 的技巧也将不胜感激。
【问题讨论】:
-
您的模式匹配中有
[Transaction{..}],这只会匹配Transactions 的单个元素列表。此外,您将两个函数传递给foldr,但它只需要一个。foldr的第一个参数必须有两个参数,但是你给它一个只带一个参数的 lambda,即x。foldr的第二个参数必须是要开始的初始值,第三个参数是要折叠的值列表。我建议先使用foldr使用更简单的示例,以直观了解它的工作原理,然后扩展到您的用例。
标签: haskell