这是什么类型的?
What kind of type is this?
我刚刚开始阅读 Tamizhvendan S 的书 F# Applied 并发现了这个代码片段:
type WebPart = Context -> Async<Context option>
我一直在浏览 Microsoft 的 F# 文档以及我最喜欢的 F# 站点 Scott Wlaschin 的 F# for Fun and Profit
,但一直找不到对这种类型的任何引用。它看起来不像记录类型。它几乎看起来像是一个普通的旧功能。那是什么?
感谢小伙伴们的帮助。
您看到的 WebPart
类型来自 Suave. You can read more about it at https://suave.io/async.html,但我会总结一下。你是对的:它 是 函数的类型。具体来说,它是一个函数,它异步地接受一个 Context
(在 Suave 中是 HTTP 请求记录和响应记录的组合)和 returns 一个 Context option
。也就是说,由于某些请求可能会失败,因此该函数可以选择返回 None
而不是值。由于某些请求可能需要很长时间,因此所有请求都被视为异步返回,因此 Async
.
为了将两个请求链接在一起,Suave 提供了绑定运算符 >=>
,这样您就不必一直输入 async { match result1 with None -> None | Some x -> return! request2 x
的样板;相反,您只需键入 request1 >=> request2
即可获得相同的效果。
如果您需要更多帮助并且通读 Suave 文档没有提供您需要的帮助,请告诉我们,我们将尝试进一步解释。
评论太长了。而且我从未使用过 Suave。但是,我认为我可以从涉及的类型的单子属性中猜测 >=>
不是绑定运算符,而是 Kleisli 组合运算符。无需观察 monad laws or trying to understand category theory,只需假定签名为:
val ( >>= ) :
Async<'a option> -> ('a -> Async<'b option>) -> Async<'b option>
val ( >=> ) :
('a -> Async<'b option>) -> ('b -> Async<'c option>) -> 'a -> Async<'c option>
绑定运算符采用 Async<'a option>
并通过活页夹函数 'a -> Async<'b option>
将其转换为 Async<'b option>
。 Kleisli 运算符将两个活页夹函数组合成第三个。
这些运算符正在处理比 type WebPart = Context -> Async<Context option>
等类型缩写所描述的具体类型更通用的单子类型和函数。运算符的实现几乎自然而然。
let (>>=) request1 binder = async {
let! result1 = request1
match result1 with
| None -> return None
| Some x -> return! binder x }
let (>=>) f g a = f a >>= g
我刚刚开始阅读 Tamizhvendan S 的书 F# Applied 并发现了这个代码片段:
type WebPart = Context -> Async<Context option>
我一直在浏览 Microsoft 的 F# 文档以及我最喜欢的 F# 站点 Scott Wlaschin 的 F# for Fun and Profit
,但一直找不到对这种类型的任何引用。它看起来不像记录类型。它几乎看起来像是一个普通的旧功能。那是什么?
感谢小伙伴们的帮助。
您看到的 WebPart
类型来自 Suave. You can read more about it at https://suave.io/async.html,但我会总结一下。你是对的:它 是 函数的类型。具体来说,它是一个函数,它异步地接受一个 Context
(在 Suave 中是 HTTP 请求记录和响应记录的组合)和 returns 一个 Context option
。也就是说,由于某些请求可能会失败,因此该函数可以选择返回 None
而不是值。由于某些请求可能需要很长时间,因此所有请求都被视为异步返回,因此 Async
.
为了将两个请求链接在一起,Suave 提供了绑定运算符 >=>
,这样您就不必一直输入 async { match result1 with None -> None | Some x -> return! request2 x
的样板;相反,您只需键入 request1 >=> request2
即可获得相同的效果。
如果您需要更多帮助并且通读 Suave 文档没有提供您需要的帮助,请告诉我们,我们将尝试进一步解释。
评论太长了。而且我从未使用过 Suave。但是,我认为我可以从涉及的类型的单子属性中猜测 >=>
不是绑定运算符,而是 Kleisli 组合运算符。无需观察 monad laws or trying to understand category theory,只需假定签名为:
val ( >>= ) : Async<'a option> -> ('a -> Async<'b option>) -> Async<'b option> val ( >=> ) : ('a -> Async<'b option>) -> ('b -> Async<'c option>) -> 'a -> Async<'c option>
绑定运算符采用 Async<'a option>
并通过活页夹函数 'a -> Async<'b option>
将其转换为 Async<'b option>
。 Kleisli 运算符将两个活页夹函数组合成第三个。
这些运算符正在处理比 type WebPart = Context -> Async<Context option>
等类型缩写所描述的具体类型更通用的单子类型和函数。运算符的实现几乎自然而然。
let (>>=) request1 binder = async {
let! result1 = request1
match result1 with
| None -> return None
| Some x -> return! binder x }
let (>=>) f g a = f a >>= g