将 lwt.t 代码放入 Ocaml 的无限循环中以获得海市蜃楼 os
Putting lwt.t code in infinite loop in Ocaml for mirage os
我有以下代码块,是我从 mirageOS github repo 修改而来的:
open Lwt.Infix
module Main (KV: Mirage_kv.RO) = struct
let start kv =
let read_from_file kv =
KV.get kv (Mirage_kv.Key.v "secret") >|= function
| Error e ->
Logs.warn (fun f -> f "Could not compare the secret against a known constant: %a"
KV.pp_error e)
| Ok stored_secret ->
Logs.info (fun f -> f "Data -> %a" Format.pp_print_string stored_secret);
in
read_from_file kv
end
此代码从名为“secret”的文件中读取数据并输出一次。 我想在休眠期间不断地读取文件并从中输出。
使用案例是这样的:虽然这个程序是 运行 我会用其他进程更新 secret
文件,所以我想看到输出的变化。
我尝试了什么?
我试图将最后一条语句放入 while 循环
in
while true do
read_from_file kv
done
但它给出了错误 这个表达式的类型为 unit Lwt.t 但表达式应该是 unit 类型,因为它在 while 循环的主体中。
我只知道 lwt 是一个线程库,但我不是 ocaml 开发人员,也不想成为一个,(我对 MirageOS 很感兴趣),所以我找不到函数式语法来写吧。
你需要把循环写成一个函数。例如
let rec loop () =
read_from_file kv >>= fun () ->
(* wait here? *)
loop ()
in
loop ()
我有以下代码块,是我从 mirageOS github repo 修改而来的:
open Lwt.Infix
module Main (KV: Mirage_kv.RO) = struct
let start kv =
let read_from_file kv =
KV.get kv (Mirage_kv.Key.v "secret") >|= function
| Error e ->
Logs.warn (fun f -> f "Could not compare the secret against a known constant: %a"
KV.pp_error e)
| Ok stored_secret ->
Logs.info (fun f -> f "Data -> %a" Format.pp_print_string stored_secret);
in
read_from_file kv
end
此代码从名为“secret”的文件中读取数据并输出一次。 我想在休眠期间不断地读取文件并从中输出。
使用案例是这样的:虽然这个程序是 运行 我会用其他进程更新 secret
文件,所以我想看到输出的变化。
我尝试了什么?
我试图将最后一条语句放入 while 循环
in
while true do
read_from_file kv
done
但它给出了错误 这个表达式的类型为 unit Lwt.t 但表达式应该是 unit 类型,因为它在 while 循环的主体中。
我只知道 lwt 是一个线程库,但我不是 ocaml 开发人员,也不想成为一个,(我对 MirageOS 很感兴趣),所以我找不到函数式语法来写吧。
你需要把循环写成一个函数。例如
let rec loop () =
read_from_file kv >>= fun () ->
(* wait here? *)
loop ()
in
loop ()