我已經開始學習F#和Suave
,我正在讀這本書F#應用。F#Suave鶯函數
我正在努力的一件事是函數。我知道它與推遲執行有關,但我不明白爲什麼以及何時需要它。我們可以使用request
函數作爲的替代函數。
任何人都可以提供關於爲什麼以及何時使用這些功能的更多細節。
我已經開始學習F#和Suave
,我正在讀這本書F#應用。F#Suave鶯函數
我正在努力的一件事是函數。我知道它與推遲執行有關,但我不明白爲什麼以及何時需要它。我們可以使用request
函數作爲的替代函數。
任何人都可以提供關於爲什麼以及何時使用這些功能的更多細節。
這三個功能是相關的,因爲request
和context
是的專用版本。他們都做同樣的事情 - 他們檢查他們的論點(某些方面),並給你一個適用於這個論點的函數。
請記住,Suave的基本「building block」,WebPart
,是一個函數HttpContext -> Async<HttpContext> option
而不是一些具體的對象。這實際上意味着這三個功能允許你檢查這個HttpContext
並且基於那個組成一個WebPart
來使用。
在它的核心,是什麼確實是非常簡單的:
let warbler f a = f a a
// ('t -> 't -> 'u) -> 't -> 'u
你給它一個函數f
和論證a
。函數f
查看a
,並返回一個新函數't -> 'u
,然後將其應用於a
。
事情有關的是,它是完全通用的 - 你可以使用任何你想使用context
或request
只要對準類型,但它不知道有關域倜儻是感興趣的東西
這就是爲什麼有它的特殊版本的「講域語言」:
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
注意,它們具有相同的「形」爲鶯 - 唯一的區別是,HttpContext
類型是「硬編碼」 - 使用起來更方便。
其他答案已經解釋了函數及其與context
和request
函數的關係。我想顯示你想要什麼時候使用這些。
當您啓動一個Suave服務器時,您需要爲其提供WebParts
的請求處理管道 - 路由,HTTP方法和響應生成功能。這意味着在您啓動Web服務器時,所有WebPart
函數都已經執行。
想象一下,一個簡約的web應用程序,打印當前服務器時間:
let app = GET >=> path "/" >=> OK (string DateTime.Now)
如果您在使用本app
管道啓動Web服務器,你會經常看到創建app
值時產生相同的時間戳,無論何時您讓網絡請求檢索它。
函數及其專用版本context
和request
不僅延遲執行,而且還使Web服務器在每次需要結果時調用提供的函數。
在示例場景這個app
將提供預期的結果:
let app = GET >=> path "/" >=> warbler (fun ctx -> OK (string DateTime.Now))
謝謝。你和scrwtp的組合答案非常有用。再次感謝。我已經提出了你的答案。 –
謝謝scrwtp。好答案。 –