2009-10-23 11 views
5

Étant donné ce bout de code OCaml:Ocaml valeurs Int et négatives

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

Le Rempl me dit que c'est le type est:

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

Lui donner des intrants tels que:

range 0 4;; 

donne la liste:

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

Cependant fournissant l'entrée

range -4 2;; 

donne l'erreur:

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

Qu'est-ce que cela essaie de me dire?

Répondre

7

lorsque vous tapez,

range -4 2;; 

vous devez vous rappeler que la - est une fonction, une fonction infixe, pas une négation unaire. Pour faire une négation unaire, vous pouvez faire l'une des deux choses suivantes: 1) précéder - signer avec ~, comme ~ -4, ou utiliser des parenthèses.

+0

Merci pour le conseil à propos de '~' Je n'étais pas au courant. – chollida

+0

bien, il n'y a rien de spécial à propos de '~' toute la fonction est définie, 'let (~ -) a = 0 - a', il y a une fonction de négation unaire correspondante pour les flotteurs, je suis sûr que vous pouvez devine ça. – nlucaroni

5

Je viens de réaliser que je dois envelopper le

-4 in parenthesis 

-à-dire appeler:

range (-4) 0;; 

donne:

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

Je vais laisser cette question en Incase quelqu'un vient d'autre à travers le même problème. Pour résumer le problème est que - est interprété comme une fonction et non comme le signe du jeton 4. Vous pouvez voir: OCaml language issues pour plus d'informations.