Ответ 1
Эти три функции связаны в том смысле, что request
и context
являются специализированными версиями warbler
. Они все делают то же самое - они проверяют (некоторые аспекты) свои аргументы и возвращают вам функцию, чтобы применить к этому аргументу.
Помните, что основной "строительный блок" Suave, WebPart
, является функцией HttpContext -> Async<HttpContext> option
, а не конкретным объектом. Это эффективно означает, что эти три функции позволяют вам проверять этот HttpContext
и основываться на компиляции WebPart
.
В своей основе, что warbler
делает очень просто:
let warbler f a = f a a
// ('t -> 't -> 'u) -> 't -> 'u
Вы даете ему функцию f
и аргумент a
. Функция f
смотрит на a
и возвращает вам новую функцию 't -> 'u
, которая затем применяется к a
.
Дело в warbler
заключается в том, что он полностью общий - вы можете использовать его в любом месте, где бы вы использовали context
или request
, пока типы выравниваются, но он ничего не знает о домене. Suave is заинтересованный.
Вот почему есть специализированные версии, которые "говорят на языке домена":
let request apply (a : HttpContext) = apply a.request a
// (HttpRequest -> HttpContext -> 'a) -> HttpContext -> 'a
let context apply (a : HttpContext) = apply a a
// (HttpContext -> HttpContext -> 'a) -> HttpContext -> 'a
Обратите внимание, что они имеют ту же самую "форму", что и warbler, - единственное отличие состоит в том, что тип HttpContext
"жестко закодирован", что делает его более удобным для использования.