>= ($/ element "div"-6ren">
gpt4 book ai didi

list - 如何将错误处理添加到列表 monad?我需要什么数据类型?

转载 作者:行者123 更新时间:2023-12-03 07:40:49 26 4
gpt4 key购买 nike

let test2 =
(fromDocument (doc :: Document) $/ element "body")
>>= ($/ element "div")
>>= (attributeIs "id" "content")
>>= ($/ element "div")
>>= (attributeIs "class" "box")

我正在使用 xml-conduit库,我得到了上面的代码,它基本上过滤了一棵树(一棵 XML 树)。

如果任何绑定(bind)( >>= )(如果这是正确使用的词)返回一个空列表,我想为“错误”添加功能。

我想做的事:

两个 elementattributeIs返回 Axis这是 Cursor -> [Cursor]
我发现很难制定我需要使用的数据类型。
我正在考虑使用 Either返回 Left a ( a 将是类似 attributeIs "id" "content" 的函数)或 Right Axis .

但我无法返回 Either如果我的理解正确,请在列表 monad 中输入。

最佳答案

如果是为了快速调试,使用 Debug.Trace .否则你要求组合单子(monad) ListEither String : 那是 monad transformer .考虑这个关于整数而不是 XML 树的更简单示例:

plusOne :: Int -> [Int]
plusOne x = [x+1]

void :: Int -> [Int]
void x = if x <= 2 then [x] else []

listPipe :: [Int]
listPipe = [1,2,3] >>= plusOne >>= void
listPipe 中的一些值被 void 剪掉了并且您想知道这在运行时何时发生。然后你的类型变成:
plusOne :: Int -> Either String [Int]
void :: Int -> Either String [Int]
listPipe :: Either String [Int]

ListT (Either String) Int 类型同构.包装它给你:
import Control.Monad.Trans.List

void :: Int -> ListT (Either String) Int
void x = ListT $ if x <= 2 then Right [x] else Left "errorVoid"

plusOne :: Int -> ListT (Either String) Int
plusOne x = ListT $ Right [x+1]

listPipe :: Either String [Int]
listPipe = runListT $ ListT (Right [1,2,3]) >>= plusOne >>= void

listPipe = Left "errorVoid" .

关于list - 如何将错误处理添加到列表 monad?我需要什么数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649028/

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