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

Ahm*_*gab 24 f#

下面的代码片段来自这里,从上下文中我了解它通过模式匹配做了什么,但是它是如何做的以及那个操作符让我进行循环.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 ? g
  • 正确的身份: f >=> return ? f
  • 关联性: (f >=> g) >=> h ? f >=> (g >=> h)

  • 在这种情况下,三重条"≡"是伸展相等的.对于*pure*函数,这意味着如果您向左侧和右侧提供相同的输入,您将从两者获得相同的输出. (3认同)