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.
我不确定如何继续.有人有任何见解吗?
runX在“转换”的定义中使用readXml将箭头转换为函数,arr在 parseItem 的定义中使用再次将该函数转换回箭头。现在,这样做就很好了,除了readString返回一个IOStateArrow(-IO State List Arrow 的特殊类型别名IOSLA),它不仅应该被视为Arrow,而且更具体地应该被视为IOArrow; Arrow同时,您可以通过使用 重新包装它来将其视为纯粹的arr。
您在这里有两个选择:
readXml = readString [withValidate no],使readXml :: String -> IOStateArrow s b XmlTree。然后你就可以... <<< readXml str在parseItem.arrIO将 readXml 提升为 IO 箭头,这样您就可以按照预期的方式使用它。在这种情况下我会使用选项 1,因为如果没有特殊原因,执行此箭头包装-展开似乎是多余的。
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |