2015-05-04 20 views
5

Próbuję uzyskać ten przykład z Suave.io kompilacji prostego F # projektu: http://suave.io/Próbka Suave.IO nie kompiluje w moim projekcie 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" ] 

Niestety Dostaję błąd kompilatora na zapytania (R) części:

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

próbowałem zawężenia błąd kompilatora do kilku prostych liniach i teraz to:

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

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

A teraz otrzymasz ten sam błąd kompilatora w wierszu pozdrowienia q. typy w moim przykładzie powyżej są:

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>) 

Więc moje typy nie są dopasowane, ale nie jestem zbyt pewny jak bym dostać nich dopasować.

Czy przykład jest już nieaktualny? Jakieś pomysły, w jaki sposób mogę uzyskać ten przykład, aby skompilować i uruchomić?

biegnę kompilacji RC Visual Studio 2015

Thanks

Odpowiedz

4

Nie jestem zaznajomiony z Suave.IO, ale patrząc na ich kodu źródłowego, to rzeczywiście wygląda jak stary przykładowy kod, który nie działa. Definicja funkcji query jest następujący:

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

zanotować trzy argumenty - jesteś tylko przekazując żądania, więc zwracana wartość nie jest wartością (lub kolekcji), to funkcja z dwoma argumentami . Z kolei operator ^^ służy do pobierania wartości z kolekcji według klucza.

Przechodząc przez historię, wydaje się, że jest to przestarzały i właściwie uszkodzony sposób pobierania zestawu parametrów zapytania. Właściwy sposób wydaje się teraz taki:

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

Dzięki. Mam teraz próbkę i działa z Twoją pomocą. Odkryłem także, że brakowało mi otwartych dla: open Suave.Utils.Collections To ma definicję operatora ^^ –

+1

@AndyB Faktycznie to zauważyłem, ale nie powinno być potrzebne - moduł jest zdefiniowane jako 'AutoOpen'. – Luaan