2009-10-23 95 views
5

鑑於這個片段的OCaml的代碼:ocaml的詮釋和負值

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

的REPL告訴我,它的類型是:

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

給它輸入,如:

range 0 4;; 

給出清單:

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

但是提供輸入

range -4 2;; 

給出了錯誤:

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

這是什麼想告訴我?

回答

7

當你輸入,

range -4 2;; 

你需要記住的是,-是一個函數,中綴函數,而不是一元的否定。

要做一元否定,你可以做兩件事之一,1)在〜之前,用〜來標記,就像〜-4,或者用括號。

+0

感謝您提供關於'〜'的提示,我不知道它。 – chollida 2009-10-23 14:24:35

+0

好吧,'〜'沒有什麼特別的功能被定義,'let(〜 - )a = 0 - a',浮點數也有相應的一元否定函數,我相信你可以猜一下。 – nlucaroni 2009-10-23 15:38:13

5

我才意識到,我需要包裹

-4 in parenthesis 

即呼籲:

range (-4) 0;; 

給出:

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

我將離開這個問題了櫃面任何人來在同一個問題上。

只是爲了總結這個問題,-被解釋爲一個函數,而不是作爲標記4的符號。

你可以看到:OCaml language issues欲瞭解更多信息。