2016-11-12 57 views
11

我已經開始學習F#和Suave,我正在讀這本書F#應用F#Suave鶯函數

我正在努力的一件事是​​函數。我知道它與推遲執行有關,但我不明白爲什麼以及何時需要它。我們可以使用request函數作爲​​的替代函數。

任何人都可以提供關於爲什麼以及何時使用這些功能的更多細節。

回答

15

這三個功能是相關的,因爲requestcontext是​​的專用版本。他們都做同樣的事情 - 他們檢查他們的論點(某些方面),並給你一個適用於這個論點的函數。

請記住,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

事情有關​​的是,它是完全通用的 - 你可以使用任何你想使用contextrequest只要對準類型,但它不知道有關域倜儻是感興趣的東西

這就是爲什麼有它的特殊版本的「講域語言」:

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類型是「硬編碼」 - 使用起來更方便。

+0

謝謝scrwtp。好答案。 –

18

其他答案已經解釋了​​函數及其與contextrequest函數的關係。我想顯示你想要什麼時候使用這些。

當您啓動一個Suave服務器時,您需要爲其提供WebParts的請求處理管道 - 路由,HTTP方法和響應生成功能。這意味着在您啓動Web服務器時,所有WebPart函數都已經執行。

想象一下,一個簡約的web應用程序,打印當前服務器時間:

let app = GET >=> path "/" >=> OK (string DateTime.Now) 

如果您在使用本app管道啓動Web服務器,你會經常看到創建app值時產生相同的時間戳,無論何時您讓網絡請求檢索它。

​​函數及其專用版本contextrequest不僅延遲執行,而且還使Web服務器在每次需要結果時調用提供的函數。

在示例場景這個app將提供預期的結果:

let app = GET >=> path "/" >=> warbler (fun ctx -> OK (string DateTime.Now)) 
+0

謝謝。你和scrwtp的組合答案非常有用。再次感謝。我已經提出了你的答案。 –