这是什么 F# 魔法 (>=>)?

What F# sorcery is this (>=>)?

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

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

更新: 确实可能是运算符超载的情况,感谢 link 对另一个 SO 问题的回答,我想我的问题的核心是什么是超载运算符的语义。查看其他 links (>>=) 似乎是典型的绑定运算符。

这是单子的 Kleisli 组合 运算符。它允许您使用 'a -> M<'b>'b -> M<'c'> 等签名组合函数,其中 M 是单子的:在您的情况下,链接文章中的 Result<'t>

>=> 实际上只是一个函数组合,但是 >> 在这里不起作用,因为第一个函数的 return 类型不是第二个函数的参数 -它被包裹在 Result<'t> 中,需要解包,这正是 >=> 实现所做的。


也可以用>>=来定义:

let (>=>) f1 f2 arg =
    f1 arg >>= f2

Haskell 的 Control.Monad 包似乎使用了这个定义。完整的类型签名也可能有帮助(取自 here):

-- | Left-to-right Kleisli composition of monads.
(>=>)       :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
f >=> g     = \x -> f x >>= g

另一个有趣的事实是,Kleisli 组合使这三个 monad laws 仅使用函数更容易表达(在我看来,这使它们更清晰):

  • 左身份:return >=> g ≡ g
  • 正确身份:f >=> return ≡ f
  • 关联性:(f >=> g) >=> h ≡ f >=> (g >=> h)