榆树如何更新列表的头部
Elm how to update head of list
我正在尝试编写小型时间跟踪应用程序,我在其中编写我所做的,它只是记录它。
我成功地实现了向日志添加条目,但是现在,我想用持续时间更新最后一个日志条目(例如,当我在 00:01 开始编程时,现在是 00:20,我开始在 SO 上写问题,所以当我将该日志条目添加到列表时,我希望列表的头部有 19 分钟的持续时间,这样我就知道我花了多少时间编程)。
我试着用这个代码来做:
addEntry: Model -> List LogEntry
addEntry model =
let
newEntry = { -- this is what we add
text = model.currentText,
timestamp = model.now,
duration = Nothing
}
lastEntry =
List.head model.log
in
case lastEntry of
Nothing ->
[newEntry] -- when the list was empty - create it with one element
Just le -> -- when not empty
newEntry :: {le | duration = newEntry.timestamp - le.timestamp } :: List.tail model.log
-- - add new element, modified head and tail
问题是 List.tail model.log
是 Maybe List LogEntry
,我希望它是 Just List LogEntry
。而且那里只能是Just List LogEntry
,因为head也是Just LogEntry
。
去那里玩什么?嵌套另一个 case
并将一个分支标记为不可访问?有一些模式如何做到这一点?或者像List a -> Maybe (a, List a)
那样的函数,那个returns头尾在同一个Maybe
?
在列表上使用模式匹配(列表可以是空列表或头尾的缺点):
let newEntry = {
text = model.currentText,
timestamp = model.now,
duration = Nothing
}
in case model.log of
[] -> [newEntry]
le :: log ->
let le' = { le | duration = newEntry.timestamp - le.timestamp }
in newEntry :: le' :: log
我正在尝试编写小型时间跟踪应用程序,我在其中编写我所做的,它只是记录它。
我成功地实现了向日志添加条目,但是现在,我想用持续时间更新最后一个日志条目(例如,当我在 00:01 开始编程时,现在是 00:20,我开始在 SO 上写问题,所以当我将该日志条目添加到列表时,我希望列表的头部有 19 分钟的持续时间,这样我就知道我花了多少时间编程)。
我试着用这个代码来做:
addEntry: Model -> List LogEntry
addEntry model =
let
newEntry = { -- this is what we add
text = model.currentText,
timestamp = model.now,
duration = Nothing
}
lastEntry =
List.head model.log
in
case lastEntry of
Nothing ->
[newEntry] -- when the list was empty - create it with one element
Just le -> -- when not empty
newEntry :: {le | duration = newEntry.timestamp - le.timestamp } :: List.tail model.log
-- - add new element, modified head and tail
问题是 List.tail model.log
是 Maybe List LogEntry
,我希望它是 Just List LogEntry
。而且那里只能是Just List LogEntry
,因为head也是Just LogEntry
。
去那里玩什么?嵌套另一个 case
并将一个分支标记为不可访问?有一些模式如何做到这一点?或者像List a -> Maybe (a, List a)
那样的函数,那个returns头尾在同一个Maybe
?
在列表上使用模式匹配(列表可以是空列表或头尾的缺点):
let newEntry = {
text = model.currentText,
timestamp = model.now,
duration = Nothing
}
in case model.log of
[] -> [newEntry]
le :: log ->
let le' = { le | duration = newEntry.timestamp - le.timestamp }
in newEntry :: le' :: log