Я пытаюсь немного изменить пример http-fetch MirageOS (https://github.com/mirage/mirage-skeleton), который можно найти внутри mirage-skeleton, но у меня возникли проблемы с пониманием того, почему я не могу переместить часть функций, выполняемых в файле config.ml, в мой файл unikernel.ml. Исходный файл config.ml следует (я скопирую только интересную часть):
[...]
let client =
foreign "Unikernel.Client" @@ console @-> resolver @-> conduit @-> job
let () =
add_to_ocamlfind_libraries ["mirage-http"];
add_to_opam_packages ["mirage-http"];
let sv4 = stack default_console in
let res_dns = resolver_dns sv4 in
let conduit = conduit_direct sv4 in
let job = [ client $ default_console $ res_dns $ conduit ] in
register "http-fetch" job
Я пытаюсь переместить эти две строки:
let res_dns = resolver_dns sv4 in
let conduit = conduit_direct sv4 in
в мой метод запуска unikernel.ml. В основном я хочу передать своему модулю только стек и позволить ему создать преобразователь DNS и канал. Моя стартовая функция выглядит следующим образом:
let start c s =
C.log_s c (sprintf "Resolving in 1s using DNS server %s" ns) >>= fun () ->
OS.Time.sleep 1.0 >>= fun () ->
let res_dns = resolver_dns s in
let conduit = conduit_direct s in
http_fetch c res_dns conduit >>= fun (data) ->
Lwt.return(dump_to_db data);
Прямо сейчас я получаю эту ошибку при отправке параметров http_fetch:
Error: This expression has type Mirage.resolver Mirage.impl
but an expression was expected of type Resolver_lwt.t
Я задаю здесь в основном концептуальный вопрос, потому что я явно чего-то упускаю. Я не эксперт в OCaml / MirageOS, но это противоречивое поведение несоответствия типов трудно понять, учитывая, что я просто вызываю одну и ту же функцию из другого файла.