Haskell:树上的箭头、XML和Hxt:将文本叶子转换为子树 背景

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-符号不可用 这样可能吗 我做了什么 我深入研究了原始的、深度递归的数据类型,最终得出以下结论: 模块询问位置

这个应用程序似乎已经死了几十年。我正在从中提取数据。Freeplane将数据存储为XML。我正在采取的第一步是使这种格式同质化

问题,我想做什么 我的目标是将
.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 #-}