ElmのDebug.traceみたいな挙動のプリンター、誰かhackageに挙げてないの?ないならさっさと作るよ? #haskell
— Yuji Yamamoto: 山本悠滋 (@igrep) 2017年1月25日
いつも秒速で作ってる人もいるみたいだけど、やっぱり逐一書く時間が勿体ないと思うのでここにメモします 1。
求めていたものはTraceUtilsにありました。
気が向いたらcabalファイルに書けばよいでしょう。
ただ、どうやらstackageには登録されておらず、LTS 7.16の時点で存在しません。
ドキュメントにも "Feel free to copy&paste these functions into modules that need them, that may be easier to remove/clean up than adding a cabal dependency."と書かれているので多分コピペした方が速いでしょう。
と、いうわけで特に便利なtraceId
とtraceIdVia
を載せちゃいます。コピペの際邪魔になりそうなのでコメントは削除しました。
好きにコピペすればいいんじゃないかな。
import Debug.Trace hiding (traceId)
traceIdVia :: Show b => (a -> b) -> String -> a -> a
traceIdVia via prefix x = trace (prefix ++ ": " ++ show (via x)) x
traceId :: Show a => String -> a -> a
traceId = traceIdVia id
-- おまけ: show ではコードポイントに変えられてしまう日本語を扱う我々にはきっとこちらの方が便利
traceStringVia :: (a -> String) -> String -> a -> a
traceStringVia via prefix x = trace (prefix ++ ": " ++ via x) x
traceString :: String -> String -> String
traceString = traceStringVia id
ちなみに、traceId
については標準のDebug.Trace
モジュールに同じ名前の関数があるので注意しましょう。なので のコードでは hiding しています。
Elmと同様log
ぐらい短い名前でいいかも。
-
この記事の最後でも触れますが、冒頭のtweetの「ElmのDebug.traceみたいな挙動のプリンター」の部分は正しくは「ElmのDebug.logみたいな挙動のプリンター」です。 ↩