Krpcannon
Krpcannon

Reputation: 121

OCaml Redefining Infix Operator

An exercise questions asks for an explanation as to why this won't work. Obviously from running the code I see that it doesn't, but I don't see in this case why. The error doesn't clarify much!

# let (+) x y z = x + y + z in 5 + 6 7;;
Error: This expression has type int
   This is not a function; it cannot be applied.

Thanks!

Upvotes: 1

Views: 550

Answers (1)

Kostya
Kostya

Reputation: 1102

Lets go step-by-step. Fire a REPL and type:

# let (+) x y z = x + y + z;;
val ( + ) : int -> int -> int -> int = <fun>

We can interpret this int -> int -> int -> int as an infix + operator that takes two ints and returns an int -> int function.

Lets check that:

# let f = 5+6;;
val f : int -> int = <fun>
# f 7;;
- : int = 18

That's every step of your intended program working.
The issue with your code is that this doesn't work:

# 5+6 7;;
Error: This expression has type int
   This is not a function; it cannot be applied.

That happens because function application has a precedence over + operator. (In fact, function application has the strongest precedence in OCaml.) So adding the brackets, fixes it (you'll need to restart the toplevel):

# let (+) x y z = x + y + z in (5+6) 7;;
- : int = 18

Upvotes: 4

Related Questions