2012-09-26 38 views
4

我有一個Ocaml函數給我錯誤。遞歸列表創建函數。錯誤類型

我所試圖做的事:

遞歸創建隨機數的大小「限制」(0-2)的列表。

這是我有:

let rec carDoorNumbers = fun limit -> 
match limit with 
| [1] -> Random.int 3 
| [] -> Random.int 3 :: carDoorNumbers (limit-1);; 

我收到此錯誤:

Error: This expression has type 'a list 
    but an expression was expected of type int 

回答

3

想想你的函數必須做:給定一個上限,你必須創建一個列出了數字。所以你的類型就像carDoorNumbers : int -> int list

看着這個,看起來你有兩個錯誤。首先,您匹配limit(應該是int)與列表模式。 [1] -> ...與僅包含元素1[]的列表匹配空列表;你真的想要匹配1和任何其他號碼n

第二個錯誤是您在match聲明中返回兩種不同類型。請記住,你應該返回一個列表。在第一種情況下,您將返回Random.int 3,這是一個int而不是int list。你真正想要返回的東西就像[Random.int 3]

你得到的錯誤是有點混亂。由於您返回的第一件東西是int,因此期望您的第二件東西也是int。但是,您的第二種情況其實是正確的:您返回int list!然而,編譯器不知道你的意思,所以它的錯誤是倒退的;而不是將int list更改爲int,您需要將int更改爲int list

+0

好吧,這是有道理的。對於我的第二種情況,我不怎麼比較空的列表[],我怎樣才能將它用於限制的其他可能性(我認爲它是一個pos#)? –

+0

參數是一個數字。你想匹配*任何*號碼(1除外,但與前一種情況相匹配)。你可以用最簡單的模式'n'來完成,它匹配任何東西並將它綁定到變量'n'。 (你可以自然地命名變量,無論你想要什麼。) –

2

match表達對待限制像一個列表。列表均爲[1][]。這就是編譯器告訴你的。但似乎限制應該是一個整數。

要匹配整數,只需使用整數常量。沒有方括號。

(作爲一個邊評論,您可能要確保功能效果很好,當你通過它0)

+0

是的我絕對不會考慮所有投入,假設pos。整數。謝謝,我會拿出括號。除了1之外,我如何使第二個案例適用於每個可能的「限制」?我越想越想我需要if/else語句。 –

+1

「通配符」模式是'_',它適用於此代碼。在OCaml中使用'if/then/else'完全沒有害處。這就是我通常用於整數的原因。 –

+0

非常感謝,_工作就像一個魅力! –