Я подозреваю, что вы сбиты с толку, потому что utop
умный.
Если вы посмотрите на документацию по утопу , там написано
, когдаиспользуя библиотеки lwt или async, UTop автоматически будет ожидать значения ['a Lwt.t] или [' a Deferred.t] и вернет вместо него ['a]
Именно поэтому
Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;
относится к типу unit
.Чтобы увидеть реальный тип, попробуйте следующее
let res = Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;
#show res;;
. Вы увидите, что когда вы получите то, что ожидали, unit Lwt.t
Обновление:
Просто длячтобы прояснить тип, у нас есть
let f = fun () -> Lwt_io.print "b"
val ( >>= ) : 'a Lwt.t -> ('a -> 'b Lwt.t) -> 'b Lwt.t
val print : string -> unit Lwt.t
val f : unit -> unit Lwt.t
Lwt_io.print "a"
, поэтому возвращает unit Lwt.t
.Это первый параметр (>>=)
, поэтому 'a
равен unit
.Второй параметр (>>=)
равен f
.f
занимает unit
, что нам и нужно, так как 'a
означает unit
.Возвращает unit Lwt.t
, поэтому 'b
также unit
.Это означает, что конечный результат будет unit Lwt.t
.