Позвольте мне объяснить, что я пытаюсь сделать в первую очередь. Я изучаю типы Ocaml, и я определяю новый тип, скажем int2
, то же самое, что и int
.Почему Ocaml выбрасывает это выражение «выражение ожидалось от типа int» только тогда, когда функция применяется к отрицательным целым числам
# type int2 = int;;
type int2 = int
Пока все хорошо.
Теперь я хочу, чтобы определить функцию, называемую add_five
, которые принимают аргумент типа int
и возвращает значение типа int2
# let add_five (x : int) = (x + 5 : int2);;
val add_five : int -> int2 = <fun>
Great! Теперь я хочу применить это к одному положительному числу и одному отрицательному числу, чтобы подтвердить, что он работает правильно.
# add_five 5;;
- : int2 = 10
Это сработало правильно!
# add_five -7;;
Error: This expression has type int -> int2
but an expression was expected of type int
Что? Я не понимаю, почему это происходит. Я прямо сказал Ocaml, что мне нужна функция возврата типа int2
, поэтому почему она требует, чтобы она была типа int
?
Вам нужны парсеры вокруг '-7':' add_five (-7) '. Здесь много ответов, которые объясняют, почему. –
В качестве побочного комментария 'type int2 = int' не определяет новый тип. Он просто определяет синоним. После этого определения 'int2' и' int' являются двумя именами для одного и того же типа. –