mizunashi-mana
edeは,大雑把にはテンプレートをJSONデータをパラメータにしてレンダリングするライブラリです.で,HaskellではJSONを扱うライブラリの金字塔として, aeson というライブラリ()があり ede でもそれを使用しています.(.=)はaesonの関数です.aesonは,Valueという型 () でJSONデータを表現しています.`fromPairs` は[(Text, Value)] というものから Value型の値を作る関数ですが,この関数はキーとその中身のJSONデータから新たなるJSONデータを作る関数 (イメージとしては,
まず一つ目ですが,aesonではToJSONという型クラスを用意しており,この型クラスには名前の通りJSONのデータへ変換できる型がインスタンスとして登録されています. (.=) は
または
とすれば見ることができます
で,ここからは推測になるのですが,Haskell事情として文字列を表すデータ型にString型は扱いにくく(特に速度を求めるものでは) text というパッケージ() を代わりに使用されることが多くあります. aeson でも例に漏れずこのパッケージを使用しており, JSONのキーとしてString型ではなくText型というものを使います. なので
[("ab", { "a": "b" }), ("cd", { "c": "d" })] => { "ab": { "a": "b" }, "cd": { "c": "d" } }
というような変換を行う関数)です.まず一つ目ですが,aesonではToJSONという型クラスを用意しており,この型クラスには名前の通りJSONのデータへ変換できる型がインスタンスとして登録されています. (.=) は
<キーとなるテキスト> .= <JSONになれる型の値(ToJSONのインスタンス)>
という感じで使い,右の値は自動的にJSONデータに変換してくれます.なので, fromPairs [ "list" .= toJSON ["aa", "bb", "cc" ]
は fromPairs [ "list" .= [ "aa", "bb", "cc" ] ]
と同値です.JSONデータとしての表現は, aeson と bytestring というライブラリをロードしてghci上で>>> import Data.Aeson >>> toJSON [ "aa", "bb", "cc" ] — Haskell上での表現が表示される
または
>>> import qualified Data.ByteString.Lazy.Char8 as BS >>> BS.putStrLn $ encode [ "aa", "bb", "cc" ] — JSONデータが表示される
とすれば見ることができます
で,ここからは推測になるのですが,Haskell事情として文字列を表すデータ型にString型は扱いにくく(特に速度を求めるものでは) text というパッケージ(
fromPairs [ ("list" :: String) .= [ "aa", "bb", "cc" ] ]
というのはコンパイルエラーを起こします. 正しい型は fromPairs [ (Data.Text.pack "list" :: Data.Text.Text) .= [ "aa", "bb", "cc" ] ]
というのが正しい表記なのですがこのような書き方は良くするので, OverloadedStrings
という拡張がよく使用されます.この拡張を有効にすると fromPairs [ ("list" :: Data.Text.Text) .= [ "aa", "bb", "cc" ] ]
という表記が可能になります.