这是什么类型的?

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