2009-10-23 634 views
5

Dadas este fragmento de código OCaml:ocaml Int y negativos valores

let rec range a b = 
    if a > b then [] 
    else a :: range (a+1) b 
    ;; 

El Sust me dice que es el tipo es:

val range : int -> int -> int list = <fun> 

Darlo insumos tales como:

range 0 4;; 

devuelve la lista:

- : int list = [0; 1; 2; 3; 4] 

Sin embargo proporcionar la entrada

range -4 2;; 

da el error:

Characters 0-5: 
    range -4 1;; 
^^^^^ 
This expression has type int -> int -> int list but is here used with type int. 

Que es esto tratando de decirme?

Respuesta

7

al escribir,

range -4 2;; 

Es necesario recordar que el - es una función, una función infija, no una negación unaria.

Para hacer la negación unaria, puede hacer una de estas dos cosas, 1) preceede - firmar con un ~, como ~ -4, o usar paréntesis.

+0

Gracias por el consejo sobre '~' no estaba al tanto. – chollida

+0

bueno, no hay nada especial en '~' toda la función está definida, 'let (~ -) a = 0 - a', también hay una función de negación unaria correspondiente para flotadores, estoy seguro de que puedes adivínalo. – nlucaroni

5

me he dado cuenta de que tengo que envolver el

-4 in parenthesis 

es decir, llamando al:

range (-4) 0;; 

Da:

- : int list = [-4; -3; -2; -1; 0] 

voy a dejar esta pregunta a cualquier otra persona en caso que viene sobre el mismo problema.

Solo para resumir, el problema es que - se interpreta como una función y no como el signo del token 4.

Puede ver: OCaml language issues para obtener más información.

Cuestiones relacionadas