hi
i want to learn ocaml and i started since days. i have this problem. why the function abs -10 is not working
but when write abs (-10) its work.
This is one of the particularities of OCaml lexical convention: the compiler reads abs -10
as (abs) - (10)
, and not as (abs) (-10)
. Consequently, it then raises an error due to the fact that abs
is a function of type int->int
whereas the binary operator -
expected an int
as its first argument.
If you want to use the unary operator, they are two possibility: either uses parenthesis abs (-10)
or the (other) unary minus operator ~-
: abs ~-10
.
but how we can know that the compiler will read the function as abs -10 or
(abs) (-10) ?. I mean for other operation also.
It is defined by precedences of operators. The idea is that some operators binds tighter than another, the same as with a + b * c
, from the school we know, that it should be read as a + (b * c)
because the *
operator has a higher precedence than +
. The function application operator, that is written just as a juxtaposition in OCaml, i.e., f x
, has higher precedence then any infix, i.e., it binds tigher than operators starting with some non-letter symbol, e.g., +,-,*,/,...
It , however, has a precedence that is lower than of the prefix operators, e.g., ~,!
. So you can write abs ~-10
where ~-
is the prefix unary minus operator. (Note that a single -
is the binary minus operator, even if you put it close to a number it will not be treated as a part of the number, neither it will be treated as an unary operator).