【发布时间】:2021-09-03 15:05:49
【问题描述】:
我有一个自定义数据对象列表,这些对象使用一个字段 total 每天跟踪不断增加的总值。自定义数据类型中的另一个字段是值new。使用 csv 文件,我已读取 date 和 total 的值,并尝试根据这些值计算和设置 new 的值。
data item = Item{
date :: Day,
total :: Int,
new :: Int
}
之前
| date | total | new |
|---|---|---|
| 01/01/2021 | 0 | 0 |
| 02/01/2021 | 2 | 0 |
| 03/01/2021 | 6 | 0 |
| 04/01/2021 | 15 | 0 |
之后
| date | total | new |
|---|---|---|
| 01/01/2021 | 0 | 0 |
| 02/01/2021 | 2 | 2 |
| 03/01/2021 | 6 | 4 |
| 04/01/2021 | 15 | 9 |
我的理解是,在 haskell 中,我应该尽量避免使用 for 循环,该循环遍历列表直到到达最后一行,例如使用循环控制在达到等于长度的值时终止的列表。
相反,我尝试创建一个函数来分配 new 的值,它可以与 map 一起使用来更新列表中的每个项目。我的问题是这样的函数需要访问正在更新的项目,以及 total 的前一个项目的值,我不确定如何在 haskell 中实现它。
--Set daily values by mapping single update function across list
calcNew:: [Item] -> Int -> [Item]
calcNew items = map updateOneItem items
-- takes an item and a value to fill the new field
updateOneItem :: Item -> Int -> Item
updateOneItem item x = Item date item total item x
是否可以在使用map 时填充该值?如果不是,是否需要递归解决方案?
【问题讨论】:
标签: list haskell map-function