5

我正在尝试从 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" ]

不幸的是,我在 (query 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 版本

谢谢

4

1 回答 1

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)
于 2015-05-04T12:38:40.767 回答