下面的代码片段来自这里,从上下文中我了解它通过模式匹配做了什么,但是它是如何做的以及那个操作符让我进行循环.MSDN没有帮助.如果那是一个运营商,它有名字吗?对不起,如果我有一些遗漏的谷歌fu.
let (>=>) f1 f2 arg =
match f1 arg with
| Ok data -> f2 data
| Error e -> Error e
Run Code Online (Sandbox Code Playgroud)
更新: 确实可能是运算符过载的情况,并且由于与其他SO问题的链接,我想我的问题的核心是重载运算符的语义是什么.查看其他链接(>> =)似乎是典型的绑定运算符.
Hon*_*tan 27
这是monad 的Kleisli合成运算符.它可以让你与像签名撰写的功能'a -> M<'b>,并'b -> M<'c'>在那里M为一元:在你的情况下,Result<'t>从链接的文章.
>=>实际上只是一个函数组合,但是>>在这里不起作用,因为第一个函数的返回类型不是第二个函数的参数 - 它包含在a中Result<'t>并且需要被解包,这正是>=>实现所做的.
它也可以用以下方式定义>>=:
let (>=>) f1 f2 arg =
f1 arg >>= f2
Run Code Online (Sandbox Code Playgroud)
似乎Haskell的Control.Monad包使用了这个定义.完整类型签名也可能有用(从这里获取):
-- | Left-to-right Kleisli composition of monads.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
f >=> g = \x -> f x >>= g
Run Code Online (Sandbox Code Playgroud)
另一个有趣的事实是,Kleisli的构图使得三个monad定律更容易通过仅使用函数来表达(在我看来,它使它们更清晰):
return >=> g ? gf >=> return ? f(f >=> g) >=> h ? f >=> (g >=> h)