Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple OCaml exercise

Tags:

ocaml

I'm trying to teach myself OCaml through Jason Hickey notes and the following exercise got me stumped. Question: Write a function sum that given two integer bounds m,n and a function f computes a summation. I'm trying this:

     let rec sum m n f=
     if m>n then 0
     else if m=n then f n
     else f m + sum n m+1 f

but it doesn't work, producing a type error.

like image 355
Torus Avatar asked Dec 12 '22 08:12

Torus


2 Answers

You need some parentheses.

let rec sum m n f=
     if m>n then 0
     else if m=n then f n
     else f m + sum n (m+1) f

(Although for readability, I would usually parenthesize the last line as else (f m) + (sum n (m+1) f). ) What's happening without the parentheses is that it's treating it as (f m) + (sum n m) + (1 f) which is producing the error that sum n m doesn't have type int, as it's a partial function application with a more complex type.

As a general rule, when an expression is being passed as an argument to a function, it always needs to be parenthesized. On a related note, if you ever actually wanted to pass the plus function as an argument, you would put it in parentheses (for example: sum m n (+) (although that wouldn't type check in this case, since + expects two numbers)).

like image 165
Keith Irwin Avatar answered Jan 08 '23 06:01

Keith Irwin


Function application (binding of function names to their arguments) has the highest precedence in OCaml. So, you need to watch your parentheses. I'm not giving the solution because it might be more fun to figure it out yourself.

like image 34
Jeffrey Scofield Avatar answered Jan 08 '23 07:01

Jeffrey Scofield