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 次 |
最近记录: |