5

単純な F# プロジェクトの Suave.io コンパイルからこの例を取得しようとしています: 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 ビルドを実行しています

ありがとう

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

3 つの引数に注意してください。リクエストを渡すだけなので、戻り値は値 (またはコレクション) ではなく、2 つの引数を持つ関数です。

一方、演算子^^は、キーによってコレクションから値を取得するために使用されます。

歴史をたどると、これは時代遅れで、実際には壊れたクエリ パラメータのコレクションを取得する方法のようです。適切な方法は次のようになります。

GET  >>= request(fun r -> OK <| greetings r.query)
POST >>= request(fun r -> OK <| greetings r.form)
于 2015-05-04T12:38:40.767 に答える