1

lwtとを使用して OCaml で簡単な Web サーバーを作成する方法を説明するチュートリアルに従っていますCohttp

以下を_tags含むファイルがあります。

true: package(lwt), package(cohttp), package(cohttp.lwt)

そしてwebserver.ml

open Lwt
open Cohttp
open Cohttp_lwt_unix

let make_server () =
  let callback conn_id req body =
    let uri = Request.uri req in
    match Uri.path uri with
    | "/" -> Server.respond_string ~status:`OK ~body:"hello!\n" ()
    | _ -> Server.respond_string ~status:`Not_found ~body:"Route not found" ()
  in
  let conn_closed conn_id () = () in
  Server.create { Server.callback; Server.conn_closed }

let _ =
  Lwt_unix.run (make_server ())

次に、ocamlbuild -use-ocamlfind webserver.native次のエラーをトリガーします。

Error: Unbound record field callback
Command exited with code 2.

次のように変更すると、次のServer.create { callback; conn_closed }ようにもトリガーされます。

Error: Unbound record field callback
Command exited with code 2.

これを解決する方法がわからないので、事前に調べていただきありがとうございます。

4

1 に答える 1

3

おそらく、古いcohttpインターフェース用に書かれた非常に古いチュートリアルを使用しています。アップストリーム リポジトリで最新のチュートリアルを参照してみてください。

あなたの場合、プログラムをコンパイルするには、少なくとも次の変更を行う必要があります。

  1. 関数Server.makeを使用してサーバーのインスタンスを作成する必要があります。
  2. callbackとのconn_closed値は、レコードとしてではなく、関数パラメーターとして渡す必要があります。

    Server.make ~callback ~conn_closed ()
    
  3. 関数を使用してServer.create、関数から返された値を渡してServer.make、サーバー インスタンスを作成する必要があります。

したがって、おそらく、次のように動作するはずです。

open Lwt
open Cohttp
open Cohttp_lwt_unix

let make_server () =
  let callback conn_id req body =
    let uri = Request.uri req in
    match Uri.path uri with
    | "/" -> Server.respond_string ~status:`OK ~body:"hello!\n" ()
    | _ -> Server.respond_string ~status:`Not_found ~body:"Route not found" ()
  in
  Server.create (Server.make ~callback ())

let _ =
  Lwt_unix.run (make_server ())
于 2016-11-07T19:01:14.693 に答える