2013-04-16 3 views
4

Я учусь. Это то, что я нашел странное:OCaml буквальное отрицательное число?

let test_treeways x = match x with 
    | _ when x < 0 -> -1 
    | _ when x > 0 -> 1 
    | _ -> 0;; 

Если бы я тогда называть это так:

test_threeways -10;; 

Я получаю ошибку несоответствия типов (потому что, насколько я понимаю, он интерпретирует унарный минус, как если это частичное применение функции, поэтому он рассматривает тип выражения, чтобы быть int -> int Однако, это:.

test_threeways (-10);; 

действует, как и ожидалось (хотя это на самом деле вычисляет Val ue, как я мог понять, он не передает постоянную «минус десять» функции.

Итак, как вы пишете постоянные отрицательные числа в OCaml?

+0

Комментарий стиля: сопоставление образцов лучше всего подходит для деструктурирования значений. Это упражнение скорее должно быть конструкцией if. –

ответ

8

Вам нужно приложить его, чтобы избежать разбора парсинга. «test_threeways -10» также может означать: вычесть 10 из test_threeways.

И нет приложения-приложения. Просто переопределить унарный минус, чтобы увидеть разницу:

#let (~-) = (+) 2 ;; (* See documentation of pervarsives *) 
val (~-) : int -> int = <fun> 
# let t = -2 ;; 
val t : int = -2 (* no function application, constant negative number *) 
# -t ;; 
- : int = 0 (* function application *) 
+0

Только если без пространства источник будет лексироваться по-другому. Пробел - это просто разграничить токены. Если вы не помещаете пробел между двумя буквенно-цифровыми идентификаторами, они образуют один большой и т. Д. – lukstafi

1

Вы можете использовать ~- и ~ -. напрямую (как намечено в другом ответе), они оба явно prefix operators, поэтому их разбор не является двусмысленным. Однако я предпочитаю использовать круглые скобки.