箭头/ HXT和类型签名

pro*_*nce 5 monads haskell types arrows hxt

我正在尝试在Haskell中学习Arrows,所以我正在使用基于箭头的HXT库编写一个简单的应用程序.HXT wiki和教程中的示例放弃了函数类型签名.但是,我非常喜欢类型,并试图找出如何使用它们.这是我遇到绊脚石的地方.鉴于这些功能:

readXml str = runX (readString [withValidate no] str)

atTag tag = deep (isElem >>> hasName tag)
Run Code Online (Sandbox Code Playgroud)

我认为他们应该被分配以下签名:

readXml ? String ? IO [XmlTree]

atTag ? ArrowXml a ? String ? a XmlTree XmlTree
Run Code Online (Sandbox Code Playgroud)

我试图使用箭头语法将它们连接在一起,如下所示:

parseItem = proc str -> do
    desc <- text <<< atTag "description" <<< arr readXml -< str
    ...
Run Code Online (Sandbox Code Playgroud)

但是,如果我的类型签名是正确的(GHC没有抱怨),我需要一种方法来结合monad语法和箭头语法来获取XmlTree并返回IO.

我不确定如何继续.有人有任何见解吗?

dfl*_*str 3

runX在“转换”的定义中使用readXml将箭头转换为函数,arr在 parseItem 的定义中使用再次将该函数转换回箭头。现在,这样做就很好了,除了readString返回一个IOStateArrow(-IO State List Arrow 的特殊类型别名IOSLA),它不仅应该被视为Arrow,而且更具体地应该被视为IOArrow; Arrow同时,您可以通过使用 重新包装它来将其视为纯粹的arr

您在这里有两个选择:

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

在这种情况下我会使用选项 1,因为如果没有特殊原因,执行此箭头包装-展开似乎是多余的。