2016-11-01 2 views
0

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

+2

Вам нужны парсеры вокруг '-7':' add_five (-7) '. Здесь много ответов, которые объясняют, почему. –

+0

В качестве побочного комментария 'type int2 = int' не определяет новый тип. Он просто определяет синоним. После этого определения 'int2' и' int' являются двумя именами для одного и того же типа. –

ответ

4

add_five -7 разобран как (add_five) - (7), т. Е. Оператор - является инфиксным. Таким образом, ожидается, что add_five будет чем-то, из которого вы можете вычесть 7, то есть значение типа int. Решение должно либо заключить в скобки (-7), либо использовать инфиксную форму отрицания ~-7