はじめに

Continuation (継続) について全く勉強したことが無いので Control.Monad.Cont で定義されている ContT とかいつ使うんだろうなーと思っていましたが、ついに利用機会がありました!!!

僕が考えたんじゃなくて fumieval さんに相談して、教えてもらったんですけどね。

問題のコード

YesodHandler ではパラメータの取得するために lookupGetParamlookupPostParam を利用すると思います。

実際にはこんな感じでパラメータを取得していくつか処理を行います。

このコード、どう考えても嫌な感じですよね・・・。ネストやばいし。

do で書くと Maybe 型なので値を返せないし、ベースに Handler モナドがあるので Either で置き換えるのも良くわかんないな・・・。と思って、結構放置してました。

ContT を使ってリファクタリング!

先程のプログラムを ContT で置き換えるとこうなります。

感動しましたね。継続すごいな!って。

まとめ

継続勉強しよ。