Le mercredi 03 novembre 2010 à 20:36 +0000, superpyrin a écrit :

> This expression has type float but is here used with type int

Your application of the ipow2 function is incorrect. In :

let an = ipow2 a (n-1)/2 in

the argument to ipow2 are a abd (n-1) (well typed), which is sufficient

for a complete application of the function. The result of the

application (a float) is then given to the infix operator ( / ) with

also the argument 2. The operator expects an int, hence the error.

You want to group the (n-1)/2 in a parenthesis to avoid this.

As a side note, the error message should explain this to you, because

the character range it gives is probably from ipow2 to (n-1), meaning

that this is one expression for the compiler and that this expression

has type float (it is not an un applied function and the error message

does not refer to just one of the arguments of the function).

Mathias

>

> However, when I define the function like this

>

> let rec ipow2 a n =

> if n = 0 then 1. else if n = 1 then a

> else

> if (n mod 2) = 1 then

> let n2 = (n-1)/2 in

> let an = ipow2 a n2 in

> a *. an *. an

> else

> let n2 = n/2 in

> let an = (ipow2 a n2) in

> an *. an

>

> it is accepted. I don't understand what is wrong in the first

> definition. Can somebody explain? I am using "The Objective Caml

> toplevel, version 3.10.2". Thank you.

>

> [Non-text portions of this message have been removed]

>

>

>

>

>