ocaml - 将 lwt.t 代码放入 Ocaml 中用于 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
但它给出了错误This expression has type unit Lwt.t but an expression was expected to type unit 因为它位于 while 循环的主体中。
我只知道 lwt 是一个线程库,但我不是 ocaml 开发人员,也不想成为其中的一员,(我对 MirageOS 很感兴趣),所以我找不到编写它的函数语法。
解决方案
您需要将循环编写为函数。例如
let rec loop () =
read_from_file kv >>= fun () ->
(* wait here? *)
loop ()
in
loop ()
推荐阅读
- python - pyvisa 找不到 VISA 实现
- java - Lettuce 多个反应式 Redis 存储和跨存储事务
- java - 点击几张图片后我的应用程序崩溃了 - 为什么?
- javascript - React redux 嵌套智能组件 - 状态未映射到道具
- javascript - 我的代码有什么问题使它重复 5 次
- linux - linux & windows socket编程(linux服务器、windows客户端)
- mysql - Mysql创建触发器语法错误使用DELIMITER $$
- android - 软键盘将内容推送到屏幕外
- c# - 如何使用实体框架在 WPF c# 中的两个表之间插入一对多关系的数据?
- c - 如果打开文件,fopen() 会返回文件指针什么?