2016-11-07 2 views
1

Я следую учебному пособию, в котором объясняется, как сделать простой веб-сервер в OCaml с lwt и Cohttp.Ошибка: поле незаблокированной записи Server.callback - Ocaml

У меня есть _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 } он также будет t rigger:

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

Я не уверен, как это решить, поэтому заранее заблаговременно заглядываем в это.

ответ

2

Возможно, вы используете очень устаревшее учебное пособие, написанное для старого интерфейса cohttp. Вы можете попробовать ознакомиться с актуальными учебниками в the upstream repository.

В вашем случае, по крайней мере, следующие изменения должны быть сделаны, чтобы скомпилировать программу:

  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()) 
+0

Это делает! Спасибо за очень подробный ответ. –

Смежные вопросы