作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
>= ($/ element "div"-6ren">
let test2 =
(fromDocument (doc :: Document) $/ element "body")
>>= ($/ element "div")
>>= (attributeIs "id" "content")
>>= ($/ element "div")
>>= (attributeIs "class" "box")
xml-conduit
库,我得到了上面的代码,它基本上过滤了一棵树(一棵 XML 树)。
>>=
)(如果这是正确使用的词)返回一个空列表,我想为“错误”添加功能。
element
和
attributeIs
返回
Axis
这是
Cursor -> [Cursor]
Either
返回
Left a
(
a
将是类似
attributeIs "id" "content"
的函数)或
Right Axis
.
Either
如果我的理解正确,请在列表 monad 中输入。
最佳答案
如果是为了快速调试,使用 Debug.Trace
.否则你要求组合单子(monad) List
和 Either 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/
我是一名优秀的程序员,十分优秀!