在xml-conduit中,什么是"适当的"将光标传递给函数的方法?

时间:2015-08-09 17:48:30

标签: xml haskell

从我问的yet another example开始,我学会了如何使用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包中提供的运算符的正确方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用>=>代替>>=来避免使用括号:

(>=>) :: 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

所以(>=>)的工作方式与(&/)类似,但不首先检索当前节点的子节点。

免责声明:我实际上没有尝试过这个