ここも、分かりにくいところがあり、ChatGPTの助けを借りるが、ほぼ完ぺきにわかりやすく説明してくれるので、非常に助かる。
・weightGraphValueはMustacheへ渡すValueを返すのが役目。
・liftIO $ mapM flat wrsについて:flatでweightはそのまま使い、日付のみ"%m/%d"形式に変換し、 flat::WeightRecord-> IO (String,Double) よりmapM flat wrsはIO[(String,Double)]を返す。このへんは、mapMの働きを覚えてないと使えない、正直言って、前に学習(P174)したことを忘れており、復習して気づいた感じ。IOを含んでいるのでliftIOでWRActionモナドに持ち上げている。
・let wrss = groupBy ((==) `on` fst) . sortBy (compare `on` fst) $ flatWrsについて:
sortBy (compare `on` fst) は、fstの日付でソートしている。groupBy ((==) `on` fst) は同じ日付のものをまとめるらしい。つまり[ [("08/20",60.5), ("08/20",61.0)], [("08/21",60.8)]となる。wrssはリストのリストになります。(==)にそういう機能があることなど、非常に細かいところだけどChatGPTがしっかり解説してくれたのには、驚いた。
本によれば、onは第二引数の関数を適用してから、第一引数の2項演算子を適用するという働きらしい。これと、上記の説明をみて、ようやく意味が理解できた。
・groupToValueについて: :: [(String, Double)] -> Valueである。
dt = head $ map fst gr→ グループの日付を取り出す(全部同じなので先頭でOK)。
wt = avg $ map snd gr→ 複数記録がある場合は平均を取る。
なるほど、うまくでてきています。これを使えばgroupToValue [("08/20",60.5),("08/20",61.0)]→ object ["day" ~> "08/20", "weight" ~> 60.75]となります。
0 件のコメント:
コメントを投稿