7
我有一個需要在一個循環接受客戶端運行的套接字服務器,所以我發現,在funcional編程,遞歸循環使用:在F#F#連續循環
let awaitConnections (wsl:WebSocketListener) =
let rec loop()=
async {
let! ws = Async.AwaitTask (wsl.AcceptWebSocketAsync(cancellation.Token))
printfn "Connection from %s" (ws.RemoteEndpoint.Address.ToString())
Async.Start <| awaitMessages ws
do! loop()}
loop()
而且此代碼調用通過這樣做:
Async.Start <| awaitConnections listener
考慮到應用程序連續運行,我應該使用迭代方法嗎? rec
方法是否創建嵌套執行堆棧?
另外,我想循環結束後做一些事情,如:
let awaitConnections (wsl:WebSocketListener) =
let rec loop()=
async {
let! ws = Async.AwaitTask (wsl.AcceptWebSocketAsync(cancellation.Token))
printfn "Connection from %s" (ws.RemoteEndpoint.Address.ToString())
Async.Start <| awaitMessages ws
do! loop()}
loop()
printf "The loop ended" // <-- this line
但後來它不能編譯,因爲awaitConnections
返回類型。我怎麼能這樣做?我做對了嗎?
謝謝!我在哪裏可以找到更多關於'return!'和'do!'的信息? – vtortola 2014-11-03 02:46:38
這是一個加載的問題,但我會給它一個鏡頭。類似'async'的計算表達式是一系列函數調用的語法糖,返回元素是函數的結果。 'do!'定義了一個返回'unit'的表達式,它在本例中基本上創建了一個新的'Async <'a>'對象,它除了在一次遞歸調用和下一次調用之間進行外,'return!'避免了這種情況。無可否認,這需要思考一下'Async'對象如何在幕後工作以使所有事情都發生。 – 2014-11-03 04:54:52
謝謝,非常有幫助。 – vtortola 2014-11-03 08:21:36