这是什么 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)
下面的代码片段来自 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)