首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在xml-导管中,向函数传递游标的“适当”方法是什么?

在xml-导管中,向函数传递游标的“适当”方法是什么?
EN

Stack Overflow用户
提问于 2015-08-09 17:48:30
回答 1查看 127关注 0票数 1

从我问过的一个previous question中,我学会了如何使用xml-conduit对GPX文件进行一些基本的XML解析。

经过一些烦躁之后,我现在有了一个处理GPX文件的函数如下:

代码语言:javascript
复制
{-# 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

特别是,我有一条线路:

代码语言:javascript
复制
  (cur $/ elm "trk" &/ elm "trkseg" &/ elm "trkpt") >>= extract

我注意到我必须将第一部分放在括号中,以便将其>>=到我的extract函数中。这是正确的方法,还是使用xml-conduit包中提供的操作符的一些惯用的方式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 18:04:34

您可以使用>=>而不是>>=来避免括号:

代码语言:javascript
复制
(>=>) :: 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

因此,(>=>)的工作方式类似于(&/),但没有首先检索当前节点的子节点。

免责声明:我还没有试过这个

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31907121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档