1

使用中にエラーが発生しましたLwt_main.run()。基本的に、2 つのタイプの無限ループがunit -> 'a Lwt.t = <fun>あり、両方のループを開始するとエラーが発生します。1 つのループがライター ループで、もう 1 つのループがリーダー ループであるというコンテキストでこれらを使用しています。基本的に、リーダーで使用するよりも頻繁にライターでデータを更新する必要があります。私が受け取ったエラーは、以下のコードで説明できます。

let rec p1 () =
Lwt_io.print "1\n"
>>= fun () -> Lwt_unix.sleep 1.0
>>= p1
;;

val p1 : unit -> 'a Lwt.t = <fun>

let rec p5 () =
Lwt_io.print "5\n"
>>= fun () -> Lwt_unix.sleep 5.0
>>= p5
;;

val p5 : unit -> 'a Lwt.t = <fun>

Lwt_main.run(p1(); p5());;

Characters 13-17:
Warning 10: this expression should have type unit.
Characters 13-17:
Warning 10: this expression should have type unit.

エラーなしで次のように Lwt_main.run ステートメントを実行できますが、この解決策は、警告を修正するのではなく、ワイルドカードで警告をマスクしているようです。

let _ = Lwt_main.run(p1())
let _ = Lwt_main.run(p5())

Lwt_main.run()ワイルドカード文字でエラーをマスクする代わりにエラーを修正できるように、このコンテキストでの適切な使用法は何ですか?

4

1 に答える 1

4

まず第一に、これはエラーではなく、警告です。で終了する式は、期待どおり;の型の値に評価されないと述べていunitます。あなたの場合、評価される式と同じ型に評価される式が 2 つありますp1 ()。明らかに typeがないため、 orの後に置くことはできません。どちらも lwt スレッドであり、(私が思うに) 並列に実行したいので、function またはそれに相当する infixを使用する必要があります:unit Lwt.tp5 ()unit;p1 ()p5 ()Lwt.pick<&>

let () = Lwt_main.run (p1 () <&> p5 ())

一方、このスレッドをシリアル化する場合、つまり、並列ではなく次々に実行する>>=場合は、操作を使用してそれらをバインドする必要があります。または、構文サポートを有効にしている場合は、構文を使用でき>>ます。実際には、モナドのセミコロンを表します。

于 2014-12-16T03:21:34.943 に答える