运行IO的哈斯克尔HXT之外?

所有我到目前为止看到的使用哈斯克尔XML工具包中的例子,HXT,使用runX执行解析器runX运行IO单子里面。 有没有使用的IO超出这个XML解析器的一种方式? 似乎是一个纯粹的操作对我来说,不明白为什么我不得不在里面IO。

--------------解决方案-------------

您可以使用HXT的xread随着runLA解析XML字符串之外IO

xread具有以下类型:

xread :: ArrowXml a => a String XmlTree

这意味着您可以使用类型的任何箭头组成它(ArrowXml a) => a XmlTree Whatever得到一个a String Whatever

runLA就像runX但类型的东西LA

runLA :: LA ab -> a -> [b]

LA是一个实例ArrowXml

为了把这个在一起,我的回答以下版本到你刚才的问题用HXT解析含无任何格式良好的XML字符串IO参与:

{-# LANGUAGE Arrows #-}
module Main where

import qualified Data.Map as M
import Text.XML.HXT.Arrow

classes :: (ArrowXml a) => a XmlTree (M.Map String String)
classes = listA (divs >>> pairs) >>> arr M.fromList
where
divs = getChildren >>> hasName "div"
pairs = proc div -> do
cls <- getAttrValue "class" -< div
val <- deep getText -< div
returnA -< (cls, val)

getValues :: (ArrowXml a) => [String] -> a XmlTree (String, Maybe String)
getValues cs = classes >>> arr (zip cs . lookupValues cs) >>> unlistA
where lookupValues cs m = map (flip M.lookup m) cs

xml = "<div><div class='c1'>a</div><div class='c2'>b</div>\
\<div class='c3'>123</div><div class='c4'>234</div></div>"

values :: [(String, Maybe String)]
values = runLA (xread >>> getValues ["c1", "c2", "c3", "c4"]) xml

main = print values

classesgetValues类似于先前的版本,有一些小的改动,以适应期望的输入和输出。 主要的区别是,在这里,我们使用xreadrunLA代替readStringrunX

这将是很好能够读取像一个懒惰的ByteString以类似的方式,但据我所知,这是目前无法与HXT。



一对夫妇的其他东西:你可以用这种方式不解析字符串IO但它可能是最好使用runX时,您可以:它可以让你在解析器,错误信息等的配置更多的控制

另外:我试图使在该示例代码简单,易于扩展,但在组合子Control.ArrowControl.Arrow.ArrowList使其能够与箭头,如果你喜欢更简洁的工作。 下面是一个等效定义classes ,例如:

classes = (getChildren >>> hasName "div" >>> pairs) >. M.fromList
where pairs = getAttrValue "class" &&& deep getText

特拉维斯·布朗的回答是非常有益的。 我只想补充我自己的解决方案,在这里,我认为这是更普遍一点(使用相同的功能,只是忽略了问题的具体问题)。

我以前在unpickle有:

upIO :: XmlPickler a => String -> IO [a]
upIO str = runX $ readString [] str >>> arrL (maybeToList . unpickleDoc xpickle)

这我能改成这样:

upPure :: XmlPickler a => String -> [a]
upPure str = runLA (xreadDoc >>> arrL (maybeToList . unpickleDoc xpickle)) str

我完全同意他的说法,这样做让你在解析器等,这是不幸的配置较少的控制。

分类:哈斯克尔 时间:2015-03-15 人气:0
本文关键词: 哈斯克尔,HXT
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.481 (s). 10 q(s)