выражение, ожидаемый тип единицы, но это уже - PullRequest
0 голосов
/ 03 марта 2019
let _ =
    try ("hello"; ()) with
    | _ -> print_endline "hi"

Компиляция этого говорит мне, что ("hello"; ()) 'должен иметь тип единицы'

На самом деле, я получаю то же самое предупреждение с этим кодом

let _ = "hello"; ()

или с этим кодом

let _ = ("hello"; ())

Но это имеет тип unit ... не так ли?

1 Ответ

0 голосов
/ 03 марта 2019

Выражение:

 let f  = "hello";1;;

Инициирует предупреждение:

 this expression should have type unit - around "hello" string.

Это потому, что вы пытаетесь вернуть первое значение через «привет», а затем вы возвращаете 1 это означает, что ocaml должен игнорировать "привет".если вы замените его на unit - что означает «здесь я ничего не возвращаю», все будет в порядке.

Выражение:

let f = (); 1;;

не вызывает предупреждения, а f является int.

Таким образом, вы получаете предупреждение, относящееся к внутреннему коду вашего выражения, а не к типу написанного вами выражения.

let f = "hello";();;

Компилятор предупреждает вас, чтоВы вычисляете что-то, что игнорируете после этого («привет» никогда не используется, и возвращаемое значение равно f равно ()).Но, как вы заметили, f имеет тип unit.

В utop:

let _ = try ("hello"; ()) with
    | _ -> print_endline "hi";;

Вы получаете:

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

, который точно соответствует позиции "hello" строки - но не расположен к ("hello"; ()).("hello"; ()) имеет тип единицы, точно так же как print_endline "hi".

Предупреждение касается только того факта, что выражение, которое должно быть вместо "hello";, должно иметь тип unit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...