这是什么F#巫术(> =>)?

时间:2015-05-07 20:21:47

标签: f#

下面的代码片段来自here,从上下文中我了解它通过模式匹配做了什么,但它是如何做的以及那个操作符让我循环。 MSDN没有帮助。如果那是一个运营商,它有名字吗?对不起,如果我有一些遗漏谷歌的话。

let (>=>) f1 f2 arg =
  match f1 arg with
  | Ok data -> f2 data
  | Error e -> Error e

更新 实际上可能是运算符过载的情况,并且由于与其他SO问题的链接,我想我的问题的核心是什么是重载运算符的语义。查看其他链接(>> =)似乎是典型的绑定运算符。

1 个答案:

答案 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