示例 Suave.IO 未在我的 F# 项目中编译
Sample Suave.IO does not compile in my F# project
我试图从 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
现在在 greetings 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
注意三个参数 - 您只是传递请求,所以 return 值不是一个值(或集合),它是一个有两个参数的函数。
另一方面,运算符 ^^
用于通过键从集合中检索值。
回顾历史,这似乎确实是一种过时且实际上已损坏的检索查询参数集合的方法。现在正确的做法好像是这样的:
GET >>= request(fun r -> OK <| greetings r.query)
POST >>= request(fun r -> OK <| greetings r.form)
我试图从 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
现在在 greetings 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
注意三个参数 - 您只是传递请求,所以 return 值不是一个值(或集合),它是一个有两个参数的函数。
另一方面,运算符 ^^
用于通过键从集合中检索值。
回顾历史,这似乎确实是一种过时且实际上已损坏的检索查询参数集合的方法。现在正确的做法好像是这样的:
GET >>= request(fun r -> OK <| greetings r.query)
POST >>= request(fun r -> OK <| greetings r.form)