1

私は自分がしていることを書く小さな時間追跡アプリケーションをプログラムしようとしていますが、それを記録するだけです。

ログへのエントリの追加を正常に実装しましたが、現在、最後のログエントリを期間で更新したいと考えています (たとえば、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 LogEntryJust List LogEntry頭もJust LogEntry.

そこで何をしますか?別のブランチをネストしcaseて、1 つのブランチをアクセス不可としてマークしますか? これを行う方法にはいくつかのパターンがありますか?List a -> Maybe (a, List a)または、同じで頭と尾を返すような関数Maybeですか?

4

1 に答える 1

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
于 2016-09-02T21:44:56.253 に答える