HXT
Haskell XML Toolbox
仕組み
getting started
example
etc.
基本的なデータ構造
code:hs
data XNode = XText String
| ...
type XmlTree = NTree XNode
NTree
Nodeと、子TreeのList
Listが空ならtreeのleafであることを表す
aで多相ってるので、これ自体は任意のtreeを表している
XNode
QNameはxmlの属性名を表す
XMLTree
XMLに具体化されたTree
HXTを扱い祭はこれが中心概念となる
例を見ればだいたい対応がわかる
code:xml
<rss version="2.0" piyo="fuga"><div>hoge</div></rss>
code:XMLTrees
[NTree
(XTag "rss"
[NTree
(XAttr "version")
[NTree (XText "2.0") []]]
,NTree
(XAttr "piyo")
[NTree (XText "fuga") []]])
[NTree
(XTag "div" [])
[NTree (XText "hoge") []]]
jsonに変換
何が嬉しくてArrow使ってるのか
code:xml
<!ELEMENT 要素名 構成要素>
大まかにわけると
XML→NTree
NTree→hs
NTree→XML
XMLからhs dataに変換する
Pickler
属性と子を並列にrecord型で定義する
属性がない場合なくて、単体の子しかない場合はMapにする
考え方としては、1fieldのRecordだからMapにする、という感じ
だから別にrecordでもいいっちゃいい
code:hs
class XmlPickler a where
xpickle :: PU a
xpickle
基本的な型はinstanceになっており、xpHogeという感じでpicklerがある
e.g. xpPrim, xpList, xpOption, ...
xpElem
xpAttr
xpWrap
2値ならtuple,
Map, List, とかで、相互変換する
xpWrap (tupleから戻す, tupleに変換) $ xpPair ..
この辺の関数は、生成と解析を担う
この辺の関数のことをpicklerと呼んでるのねmrsekut.icon
この辺の用意されたpicklerを使って自作型向けのやつを定義していく
XML→???→???
filterの概念
type Filter a b = a -> [b]という型のものをfilterと呼ぶ
例えば、type XmlFilter = XmlTree -> [XmlTree]
述語
selector
constructor
transformer
treeを別のtreeにmappingする関数
tracersal filter
traceMsg
中間結果を表示する
引数が0なら何も表示しない
isA
述語を引数にとってfilterを返す
普通の関数を、arrowにliftingする
arr
普通の関数を、arrowにliftingする
deep f
tree全体をtraverseする
filterであるf満たす全てのsub treeを収集する
multi f
こっちが全体のtraverseかmrsekut.icon
deepとの差異をよくわかっていないmrsekut.icon
>>>
andと見なせる
ArrowとListの関連をうまく使った定義をしている
ちゃんと見てみると面白そう
条件分岐
orElse
||のイメージ
guards
when
<+>
orみたいなやつ
たぶんArrow型クラス内の演算子
writeDocument
書き込みの方
renderの方
今回は必要ないはず