Haskell:树上的箭头、XML和Hxt:将文本叶子转换为子树 背景
这个应用程序似乎已经死了几十年。我正在从中提取数据。Freeplane将数据存储为XML。我正在采取的第一步是使这种格式同质化 问题,我想做什么 我的目标是将Haskell:树上的箭头、XML和Hxt:将文本叶子转换为子树 背景,xml,haskell,tree,arrows,do-notation,Xml,Haskell,Tree,Arrows,Do Notation,这个应用程序似乎已经死了几十年。我正在从中提取数据。Freeplane将数据存储为XML。我正在采取的第一步是使这种格式同质化 问题,我想做什么 我的目标是将.xml格式文件中的每个XText项转换为一个名为“node”的XTag,其属性名为“TEXT”。我已经完成了,但方式似乎不雅 我想这样做: do t>>添加属性“文本”t 但是当我尝试时,我被告知没有monad实例,因此,do-符号不可用 这样可能吗 我做了什么 我深入研究了原始的、深度递归的数据类型,最终得出以下结论: 模块询问位置
.xml
格式文件中的每个XText
项转换为一个名为“node”的XTag
,其属性名为“TEXT”。我已经完成了,但方式似乎不雅
我想这样做:
do
t>>添加属性“文本”t
但是当我尝试时,我被告知没有monad实例,因此,do
-符号不可用
这样可能吗
我做了什么
我深入研究了原始的、深度递归的数据类型,最终得出以下结论:
模块询问位置
导入控制。类别隐藏((.),id)
导入控制。箭头
导入Text.XML.HXT.Core
导入Data.Tree.NTree.TypeDefs
textToNode::IOSArrow XmlTree XmlTree
textToNode=arr f其中
f::XmlTree->XmlTree
f(NTree(XText s)儿童)=
--“children”始终是文本项的空子树
设attrs=[NTree
(XAttr$mkName“文本”)
[NTree(XText s)[]]
在NTree(XTag(mkName“node”)attrs中的子级
fx=x
go::IO[XmlTree]
去=
朗克斯$
readDocument[withValidate no]“flat.xml”
>>>最深(ifA isText textToNode none)
>>>树“-”
要查看它的运行情况,请创建一个名为“flat.xml”的文件,其中包含:
1.
2.
当您运行go
时,您会返回“1”和“2”,但会像这样插入到XTag
s中:
---XTag "node"
| "TEXT"="1"
(您还将返回一些空白;这并不重要。)
Arrow
没有do
符号,但它有类似的符号,称为proc
符号或Arrow语法。请特别参阅这两种符号之间的关系。有了它,你可以用与你想做的相似的风格来写作:
textToNode :: IOSArrow XmlTree XmlTree
textToNode = proc x -> do
text <- getText -< x
node <- eelem "node" -<< text
tree <- addAttr "TEXT" text -<< node
returnA -< tree
你选择hxt有什么特别的原因吗?没有。我想是谷歌排名。到现在为止,我已经花了半个星期的时间学习它了。我真的很喜欢它,它激励着我去学习箭的东西。这是我梦想得到的一切。
{-# LANGUAGE Arrows #-}