2015-05-04 41 views
5

我想從Suave.io編譯一個簡單的F#項目這個例子: http://suave.io/樣品Suave.IO並不在我的F#項目編譯

open Suave.Http.Applicatives 
open Suave.Http.Successful 
open Suave.Web 
open Suave.Types 
open Suave.Model 

let greetings q = 
    defaultArg (q ^^ "name") "World" |> sprintf "Hello %s" 

let sample : WebPart = 
    path "/hello" >>= choose [ 
    GET >>= request(fun r -> OK <| greetings (query r)) 
    POST >>= request(fun r -> OK <| greetings (form r)) 
    NOT_FOUND "Found no handlers" ] 

不幸的是我得到一個編譯器錯誤在(查詢R)部分:

error FS0001: Expecting a type supporting the operator '^^' but given a function type. You may be missing an argument to a function. 

我試圖編譯器錯誤縮小到幾個簡單的線條,現在有這樣的:

let greetings q = 
    defaultArg (q ^^ "name") "World" |> sprintf "Hello %s" 

let q (rqst : string) = query rqst 
let t = greetings q 

現在在問候q行上得到相同的編譯器錯誤。 上面我的例子中的類型有:

query: 
    string -> (string -> Choice<'T,string>) -> HttpRequest -> Choice<'T,string> 

greetings: 
(string -> (string -> Choice<obj,string>) -> HttpRequest -> Choice<obj, string>) -> string 

q: 
    string -> ((string -> Choice<'a, string>) -> HttpRequest -> Choice<'a, string>) 

所以,我的類型不匹配,但我不太知道我怎麼會得到這些投其所好。

這個例子剛過時嗎? 任何想法,我可以如何得到這個例子編譯和運行?

我在運行Visual Studio的RC版本2015年

感謝

回答

4

我不熟悉Suave.IO,但看着他們的源代碼,它的確看起來像一個古老的示例代碼,不再有效。該query函數的定義如下:

let query queryKey f (req : HttpRequest) = 
    req.queryParam queryKey 
    |> Choice.from_option (sprintf "Missing query string key '%s'" queryKey) 
    |> Choice.bind f 

注意三個參數 - 你只是路過的要求,因此,返回值不是一個值(或集合),它有兩個參數的函數。

另一方面,運營商^^用於通過密鑰從集合中檢索值。

縱觀歷史,它確實看起來似乎是一種檢索查詢參數集合的過時且實際上已經斷開的方式。正確的方式現在似乎是這樣的:

GET >>= request(fun r -> OK <| greetings r.query) 
POST >>= request(fun r -> OK <| greetings r.form) 
+0

謝謝。我現在有你的幫助,現在開始運行樣品。 我還發現我錯過了開放的: 打開Suave.Utils.Collections 這有^^運營商的定義 –

+1

@AndyB我實際上也注意到,但它不應該需要 - 模塊是定義爲'AutoOpen'。 – Luaan