OCaml возвращаемые значения - PullRequest
8 голосов
/ 15 июня 2011

В книге «Разработка приложений с помощью OCaml» имеется следующее объяснение возвращаемых значений:

Поскольку значение, предшествующее точке с запятой, отбрасывается, Objective CAML выдает предупреждение, когда оно не относится к типу unit.

# print_int 1; 2 ; 3 ;;
Characters 14-15:
Warning: this expression should have type unit.
1- : int = 3


To avoid this message, you can use the
function ignore:

# print_int 1; ignore 2; 3 ;; 
1- : int = 3`

Я не понимаю, почему было бы проблемой, если 2 имеет возвращаемое значение, отличное от unit, потому что я намерен не возвращать 2, а возвращать 3. Насколько я понимаю, любая инструкция, предшествующая моей самой последней инструкции, не является возвращаемым значением функции, так почему предупреждение?

У меня было это предупреждение во всем коде, и мне стало ясно, что я не совсем понимаю, как возвращаемые значения действительно работают в OCaml.

Спасибо за вашу помощь.

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Рассмотрим выражение e1 ; e2. По определению - оценка всего этого выражения приводит к вычислению e1, а затем e2, а итоговое значение всего выражения равно значению e2. Значение результата e1 отбрасывается. Это не проблема, если тип e1 равен unit, потому что он имеет единственное значение обитателя (). Для всех других типов отбрасывание результата e1 означает потерю информации, которая, вероятно, не соответствует намерениям программиста, а значит, и предупреждение. Программист должен явно игнорировать значение результата либо с ignore, либо с

let (_:type) = e1 in
e2

Тип аннотации может быть опущен, но может быть полезно убедиться, что e1 полностью оценен для ожидаемого типа (не частичное применение).

4 голосов
/ 15 июня 2011

Ну, предупреждение есть, потому что тот факт, что вы производите значение, но затем не используете его, может быть (и очень часто) указывает на то, что вы делаете что-то не так.Если вы не согласны с этой политикой, вы можете отключить это предупреждение.Но, как обычно, хорошей практикой является не делать этого, и в этом случае, если вам действительно не нужно значение выражения, вы действительно можете использовать игнорировать или связать его с _, как в let _ = f() in ....

...