gpt4 book ai didi

haskell - 箭头/HXT 和类型签名

转载 作者:行者123 更新时间:2023-12-04 20:52:51 29 4
gpt4 key购买 nike

我正在尝试在 Haskell 中学习 Arrows,所以我正在使用基于箭头的 HXT 库为 XML 编写一个简单的应用程序。 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 .

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

最佳答案

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

您在这里有两个选择:

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

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

    关于haskell - 箭头/HXT 和类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467979/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com