5

我正在尝试在 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.

我不确定如何进行。有人有任何见解吗?

4

1 回答 1

3

runXreadXml“转换”箭头的定义中使用将箭头转换为函数,并arr在 parseItem 的定义中使用将该函数再次转换回箭头。现在,这样做会很好,除了readString返回一个IOStateArrow(-IO 状态列表箭头的特殊类型别名IOSLA),它不仅应该被视为一个Arrow,而且更具体地说是一个IOArrow;同时,您Arrow通过使用arr.

您在这里有两个选择:

  1. 使readXml = readString [withValidate no],这样readXml :: String -> IOStateArrow s b XmlTree。然后你就可以... <<< readXml strparseItem.
  2. 用于arrIO将 readXml 提升为 IO 箭头,这样您就可以按照预期的方式使用它。

在这种情况下,我会使用选项 1,因为如果没有特殊原因,这样做似乎是多余的。

于 2011-12-12T00:40:19.620 回答