我正在尝试在 Haskell 中学习箭头,因此我正在使用基于箭头的 XML HXT 库编写一个简单的应用程序。HXT wiki 和教程中的示例放弃了函数类型签名。但是,我非常喜欢类型,并且正在尝试弄清楚如何使用它们。这是我遇到的绊脚石。鉴于这些功能:
readXml str = runX (readString [withValidate no] str)
atTag tag = deep (isElem >>> hasName tag)
我认为他们应该被分配以下签名:
readXml ∷ String → IO [XmlTree]
atTag ∷ ArrowXml a ⇒ String → a XmlTree XmlTree
我正在尝试使用箭头语法将它们连接在一起:
parseItem = proc str -> do
desc <- text <<< atTag "description" <<< arr readXml -< str
...
但是,如果我的类型签名是正确的(GHC 没有抱怨),我需要一种结合 monad 语法和箭头语法的方法来XmlTree
退出并返回IO
.
我不确定如何进行。有人有任何见解吗?