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