Ocaml Lwt тип путаницы - PullRequest
       24

Ocaml Lwt тип путаницы

0 голосов
/ 20 апреля 2019

Я запутался, почему функция печати Lwt Lwt_io.print имеет тип string -> unit Lwt.t Но если я запускаю Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;, в результате выдается «ab» и возвращается единица измерения.

Я бы предположил, что это будет ошибка типа, поскольку Lwt_io.print возвращает единицу Lwt.t, а не единицу. Почему вторая часть темы называется?

1 Ответ

2 голосов
/ 20 апреля 2019

Я подозреваю, что вы сбиты с толку, потому что 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.

...