りんごがでている

何か役に立つことを書きます

Yesodチュートリアルの蛇足(3)

前回に引き続きYesodチュートリアルを先に進めていこう。

参考にしているチュートリアルはこちら
Haskell web programming


今回は3章Mirrorをやってみる。
こんな入力フォームに"Hello Yesod!"と打つと、そのテキストとテキストをひっくり返した文字列を結合した文字が表示される。
f:id:bicycle1885:20120214173519p:plain

("Hello Yesod!"と入力した)
f:id:bicycle1885:20120214173556p:plain

実装したコードを見てみると、Handler/Mirror.hsの中では次のように書かれている。

getMirrorR :: Handler RepHtml
getMirrorR = do
    defaultLayout $ do
        $(widgetFile "mirror")

これは、前回つくったEchoでも出てきているが、2つの"$"が登場している。
一つ目の$は関数に引数を適用するためのもの(中置演算子)で、カッコで代用できる。
だから、これでも問題ない。

getMirrorR :: Handler RepHtml
getMirrorR = do
    defaultLayout ( $(widgetFile "mirror") )

二つ目の$はTemplate Haskellにおいて構文木を接合するもので、$()の内部の構文木をその場につなぎあわせるものらしい。
その$()の中でwidgetFile関数が呼ばれていて"mirror"を引数としてとっている。すると、以下のテンプレートファイルを存在すれば読み込む。

  • templates/mirror.hamlet
  • templates/mirror.lucius
  • templates/mirror.cassius
  • templates/mirror.julius

今回はmirror.hamletとposted.hamletが読まれることになる。

WidgetというのはHTMLを"a monolithic tree of tags"ではなく"a number of distinct components in the page"と捉えるというものらしい。
詳しくはWidgetsに書いてる。

入力されたテキストは、POSTで渡され、postMirrorR関数内でpostedTextに束縛されている。
Hamletでは、呼ばれた関数内にある変数を自由に参照できるため、Hamletで入力されたテキストを受け取るには単純に#{postedText}とすればよい。
また、テキストを逆順にする関数reverseはHamlet側で利用する。
すなわち#{T.reverse postedText}となる。このTはHandlerの方で

import qualified Data.Text as T

となっていることから分かるようにData.Textモジュールであることを示している。
Hamletの#{...}内では、様々な関数が適用できることになる。