top page > computer > haskell > web_lecture > for_programmer > nml4.html
更新日:
文責: 重城良国

NML(Nano Markup Language): 4. 表示

Nml0.hs

はじめに

Nml型の値を文字列にエンコードする。

スタブ

モジュールNmlにスタブを作る。

fromNml :: Nml -> String
fromNml = concatMap toString . toTokens

toString :: [Token] -> String
toString = undefined

toTokens :: Nml -> [Token]
toTokens = undefined

関数toTokens

樹構造をフラットなトークン列に変換する。

toTokens :: Nml -> [Token]
toTokens (Node tx []) = [Text tx]
toTokens (Node tg ns) = Open tg : concatMap toTokens ns ++ [Close tg]

葉(Node _ [])であれば値をTextトークンとして返す。子要素を持つのであれば開きタグと閉じタグとを両端に置き、子要素のリストそれぞれに対し再帰的に関数toTokensを適用する。

テスト用のサンプルNmlデータを定義する。

sample1, :: Nml
sample1 = Node "hello" [Node "world" []]

% ghci Nml.hs
*Nml> toTokens sample1
[Open "hello",Text "world",Close "hello"]

関数toString

ひとつのトークンを文字列に変換する。

toString :: Token -> String
toString (Open tg) = "<" ++ tg ++ ">"
toString (Close tg) = "</" ++ tg ++ ">"
toString (Text tx) = tx

開きタグ、閉じタグ、テキストをそれぞれ適切な文字列表現に変換する。

*Nml> :reload
*Nml> fromNml sample1
"<hello>world</hello>"

エクスポートリスト

エクスポートリストにfromNmlを追加する。

module Nml (Nml, nml, fromNml) where

関数fromBooklist

Books.hs

モジュールBooksの関数fromBooklistを完成させる。

fromBooklist :: [Book] -> String
fromBooklist = fromNml . fromBooklistNml

エクスポートリストに追加する。

module Books (Book(..), booklist, fromBooklist) where

まとめ

これで文字列から型[Book]へのデコーダbooklist、型[Book]から文字列へのエンコーダfromBooklistの両方向の変換関数が作成できた。

「NML(3): 他の型からの変換」へもどる 「構文: deriving Read」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics