2009-10-23 12 views
5

dato questo frammento di codice OCaml:OCaml Int e negativi valori

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

Il Repl mi dice che si tratta di tipo è:

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

Dandogli ingressi come ad esempio:

range 0 4;; 

restituisce l'elenco:

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

fornendo Tuttavia l'ingresso

range -4 2;; 

dà l'errore:

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

Cos'è questo cercando di dirmi?

risposta

7

quando si digita,

range -4 2;; 

è necessario ricordare che il - è una funzione, una funzione di infisso, non una negazione unaria.

Per eseguire la negazione unaria è possibile eseguire una delle due operazioni, 1) precedere: firmare con un ~, come ~ -4, o utilizzare la parentesi.

+0

Grazie per il suggerimento su "~" non ne ero a conoscenza. – chollida

+0

beh, non c'è nulla di speciale su '~' l'intera funzione è definita, 'let (~ -) a = 0 - a', c'è una corrispondente funzione di negazione unaria per i float, sono sicuro che puoi indovina – nlucaroni

5

Ho appena capito che ho bisogno di avvolgere il

-4 in parenthesis 

cioè chiamando:

range (-4) 0;; 

Dà:

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

lascerò questa domanda fino in caso qualcuno viene altro attraverso lo stesso problema.

Solo per riassumere il problema è che - viene interpretato come una funzione e non come il segno del token 4.

È possibile visualizzare: OCaml language issues per ulteriori informazioni.

Problemi correlati