【问题标题】:Sample Suave.IO does not compile in my F# project示例 Suave.IO 无法在我的 F# 项目中编译
【发布时间】:2015-07-13 19:27:28
【问题描述】:

我正在尝试从 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 版本

谢谢

【问题讨论】:

    标签: f# suave


    【解决方案1】:

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

    【讨论】:

    • 谢谢。在您的帮助下,我现在已经启动并运行了示例。我还发现我错过了 open for: open Suave.Utils.Collections 这有 ^^ 运算符的定义
    • @AndyB 我实际上也注意到了这一点,但它不应该是必需的——模块被定义为AutoOpen
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2012-11-08
    相关资源
    最近更新 更多