榆树如何更新列表的头部

时间:2016-09-02 21:28:52

标签: elm cons cdr

我正在尝试编写小型时间跟踪应用程序,在那里我写下我的工作,它只是记录它。

我成功实现了向日志添加条目,但现在,我想更新持续时间的最后一个日志条目(例如,当我在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.logMaybe List LogEntry,我希望它是Just List LogEntry。它只能是Just List LogEntry,因为头部也是Just LogEntry

该怎么办?嵌套另一个case并将一个分支标记为无法访问?有一些模式怎么做?或者像List a -> Maybe (a, List a)这样的函数,它在同一个Maybe中返回头部和尾部?

1 个答案:

答案 0 :(得分:3)

在列表上使用模式匹配(列表可以是空列表或头尾的缺点):

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