Saturn 路由器 - getf 和 get 的功能相同吗?

Saturn Router - same function for getf and get?

应该是个简单的问题,但我找不到 API 详细说明如何执行此操作的文档。

我有这样的控制器功能

let loadScreen (ctx: HttpContext) (number: int) : HttpHandler = htmlString "etc"

以及定义两个使用该功能的路由的路由器。将默认值 0 传递给 number 参数。另一个允许用户指定一个数字

let PageRouter = router {
    (* Works fine: *)
    get "/order" (warbler (fun (_, ctx) -> PageController.loadScreen ctx 0))
    (* Does not compile: *) 
    getf "/order/%i" (fun number func ctx -> PageController.loadScreen ctx number)
}

这给出了错误

This expression was expected to have type 'HttpFuncResult' but here has type 'HttpFunc -> 'a -> HttpFuncResult' 

我知道这是一个简单的缺失,但不知道是什么。

干杯

get 组合器需要类型为 HttpHandler 的第二个参数。这是你的代码:

get "/order" (warbler (fun (_, ctx) -> PageController.loadScreen ctx 0))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         /
                                This is an HttpHandler value
另一方面,

getf 需要一个不同的第二个参数。它需要一个以 int 作为参数并以 returns 作为结果的 HttpHandler 的函数。

所以只需将 fun number -> 贴在现有的 HttpHandler 前面,瞧:

getf "/order/%i" (fun number -> 
  (warbler (fun (_, ctx) -> PageController.loadScreen ctx number))
)