- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Functional Programming in C++ ,第 214 页,引用 expected<T,E>
monad 与 Haskell 的 Either
相同, 阅读
[...] as soon as any of the functions you're binding to returns an error, the execution will stop and return that error to the caller.
然后,在下面的标题中,它显示
If you call
mbind
[equivalent to Haskell's>>=
] on anexpected
that contains an error,,mbind
won't even invoke the transformation function; it will just forward that error to the result.
这似乎是在“调整”之前写的内容。 (我很确定 LYAH 或 RWH 在某处强调没有短路;如果你记得在哪里,请提醒我。)
事实上,我对 Haskell 的理解是,在单子(monad)绑定(bind)链中,所有绑定(bind)都是真实发生的;然后他们如何处理作为第二个参数传递给他们的函数,取决于特定的 monad。
在Maybe
的情况下和 Either
,当绑定(bind)传递给 Nothing
时或 Left x
参数,则忽略第二个参数。
不过,在这两种特定情况下,我想知道这样做是否会降低性能
justPlus1 = Just . (+1)
turnToNothing = const Nothing
Just 3 >>= turnToNothing >>= justPlus1
>>= justPlus1
>>= justPlus1
>>= justPlus1
>>= justPlus1
因为在这些情况下,链不能真正做除它所做的之外的任何事情
Nothing >>= _ = Nothing
Left l >>= _ = Left l
最佳答案
考虑以下表达式:
result :: Maybe Int
result = x >>= f >>= g >>= h
当然,在该表达式中,x::Maybe a
用于某些 a
,以及每个 f
、g
和 h
是函数,h
返回 Maybe Int
但管道的中间类型可以是任何包装在 也许
。也许 f::String -> Maybe String
,g::String -> Maybe Char
,h::Char -> Maybe Int
。
让我们也明确关联性:
result :: Maybe Int
result = ((x >>= f) >>= g) >>= h
要对表达式求值,每个绑定(bind) (>>=
) 实际上都必须被调用,但函数f
、g
,或h
。最终,对 h
的绑定(bind)需要检查其左侧参数,以确定它是 Nothing
还是 Just something
;为了确定我们需要调用对 g
的绑定(bind),并决定我们需要调用对 f
的绑定(bind),这必须至少查看 x
。但是,一旦这些绑定(bind)中的任何一个产生了 Nothing
,我们只需为在每一步检查 Nothing
付费(非常便宜),而不是为调用(可能昂贵的)下游函数付费。
假设 x = Nothing
。然后 f
的绑定(bind)会检查它,看到 Nothing
,并且根本不会调用 f
。但是我们仍然需要绑定(bind)它的结果,以便知道它是否为 Nothing
。这一直沿着链向下,直到我们最终得到 result = Nothing
,调用了 >>=
三次但没有函数 f
,g
,或h
。
Either
与 Left
值的行为相似,而其他 monad 可能有不同的行为。列表可以调用每个函数一次、多次或不调用;元组 monad 只调用每个函数一次,没有短路或其他多重性特征。
关于c++ - Maybe 和 Either 单子(monad)、短路和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63943706/
我有一个使用 HsOpenSsl 的 readPrivateKey 函数读取 Rsa key 的函数,不幸的是,我的函数的签名是这个 String -> IO (Maybe (IO Maybe Rsa
我有一个类型 data Foo = Foo { bar :: Bar, baz :: Baz } 我正在尝试解析文件以构造 Foo .我有函数可以尝试解析 Bar和 Baz成员(member) par
我有一个可能的列表和一个给我节点颜色的函数(如果存在): maybeNeighbors :: [Maybe Node] nodeColor :: Node -> Maybe Color 现在
我有一个可能的列表和一个给我节点颜色的函数(如果存在): maybeNeighbors :: [Maybe Node] nodeColor :: Node -> Maybe Color 现在
我想有一个类型的函数: f :: [Maybe a] -> Maybe [a] 例如 f [Just 3, Just 5] == Just [3, 5] f [Just 3, Nothing] ==
我刚开始学习 Haskell,我发现自己正在为家庭作业编写这段代码: eval :: ExprT -> Integer eval (Lit x) = x eval (Add x y) = (e
我有一个类型为 Integral => a -> a -> Maybe a 的函数 f。这意味着 f 1 2 是有效的代码,但是自然的组合,例如 f (f 3 4) 5 f 6 (f 7 8) f (
我刚开始学习 Haskell,我发现自己正在为家庭作业编写这段代码: eval :: ExprT -> Integer eval (Lit x) = x eval (Add x y) = (e
是否可以轻松(无需重新发明轮子)从 (Maybe a, b) 转换至 Maybe (a,b) .我看了Traversable但不能让它工作。 最佳答案 您也可以使用 Bitraversable : b
我正在处理一个库( ghcjs-dom ),其中每个函数都返回一个 IO (Maybe T) . 我有一个函数a with 返回 IO (Maybe x)和功能 b需要x作为参数并返回 IO (May
我想计算列表的两个 elemIndex 值的差值。 colours = ["blue", "red", "green", "yellow"] ib = elemIndex "blue" colours
有一个标准tryPick如果 F# 返回第一个(从左到右,如果有的话)函数在列表元素上成功应用的函数。我希望在 Haskell 中有一个像这样的标准函数。我 tried胡歌,没有找到任何东西。 我是
我想将 Gen (Maybe Int) 转换为 Maybe Int。我有一个生成 1 到 9 之间的随机 Just Int 的函数。我想使用单元格函数,但我无法更改其类型签名中的任何内容。有什么建议吗
我想将以下回调代码包装到 Maybe public class FooDataSource ... public Maybe get(){ return Maybe.create(emitte
我想将 Gen (Maybe Int) 转换为 Maybe Int。我有一个生成 1 到 9 之间的随机 Just Int 的函数。我想使用单元格函数,但我无法更改其类型签名中的任何内容。有什么建议吗
这可能是一件简单的事情,但我正在编写一个想要返回记录的函数,并且其中几个字段需要执行可能失败的操作,所以现在结果记录看起来像这样(假设它是类型别名为 MyRecord)。 { field1 : May
为什么流程会在这里抛出错误? type MaybeProp = { prop: ?number, } type DefinetlyProp = { prop: number, } const
我想建立一个 Repository返回 Single 的类. 该类应首先查看 Cache返回 Maybe如果 Maybe完成转到我的Service返回 Single interface Cache {
使用 Typescipt 4.x.x 我写了一些代码来实现其他语言 Elm/Rust/Haskell 中常用的 Maybe/Option 类型。 我想写一个可以接受映射类型的通用函数 type MyM
在 Elm 中,将 List (Maybe a) 转换为 Maybe (List a) 的好方法是什么? 逻辑很简单: 如果所有项都是Just a,则返回Just (List a) 否则,返回Noth
我是一名优秀的程序员,十分优秀!