从我问过的一个previous question中,我学会了如何使用xml-conduit对GPX文件进行一些基本的XML解析。
经过一些烦躁之后,我现在有了一个处理GPX文件的函数如下:
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.Text as T
import Text.XML
import Text.XML.Cursor
data Trkpt = Trkpt {
trkptTime :: Text,
trkptLat :: Text,
trkptLon :: Text
} deriving (Show)
trkptsFromFile path =
trkpts . fromDocument <$> Text.XML.readFile def path
trkpts cur =
(cur $/ elm "trk" &/ elm "trkseg" &/ elm "trkpt") >>= extract
where
elm n = element $ Name n (Just "http://www.topografix.com/GPX/1/1") Nothing
extract cur = do
let time = T.concat $ cur $/ elm "time" &// content
let lat = T.concat $ attribute "lat" cur
let lon = T.concat $ attribute "lon" cur
return $ Trkpt time lat lon特别是,我有一条线路:
(cur $/ elm "trk" &/ elm "trkseg" &/ elm "trkpt") >>= extract我注意到我必须将第一部分放在括号中,以便将其>>=到我的extract函数中。这是正确的方法,还是使用xml-conduit包中提供的操作符的一些惯用的方式?
发布于 2015-08-09 18:04:34
您可以使用>=>而不是>>=来避免括号:
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
-- Specializing for m ~ [] and a ~ Cursor Node and b ~ Cursor Node
(>=>) :: Axis Node -> (Cursor Node -> [c]) -> Cursor Node -> [c]
cur $/ elm "trk" &/ elm "trkseg" &/ elm "trkpt" >=> extract因此,(>=>)的工作方式类似于(&/),但没有首先检索当前节点的子节点。
免责声明:我还没有试过这个
https://stackoverflow.com/questions/31907121
复制相似问题