Saturn Router - одна и та же функция для getf и 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' 

Я знаю, что этого просто не хватает, но не могу понять, что именно.

Ваше здоровье

1 ответ

The getкомбинатор ожидает второй параметр типа . Это в вашем коде:

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

getf, с другой стороны, ожидает другой второй параметр. Он ожидает функцию, которая принимает intв качестве параметра и возвращает в качестве результата.

Так что просто придерживайся fun number -> перед вашим существующим HttpHandler, и вуаля:

      getf "/order/%i" (fun number -> 
  (warbler (fun (_, ctx) -> PageController.loadScreen ctx number))
)
Другие вопросы по тегам