sample suave.io不会在我的f#项目中编译



我正在尝试从suave.io汇编简单f#项目的示例:http://suave.io/

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 2015的RC版本

谢谢

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

最新更新