2012-01-19 62 views
3

現在我開始使用Ocaml,但我遇到了問題。當我輸入這段代碼時,我的測試用例報告說即使我實現了它,代碼也沒有實現。某處是否存在某種語法錯誤?我真的不習慣這種語言,所以是的。提前致謝。開始Ocaml - 返回未實現的測試用例

let rec move_robot (pos: int) (dir: string) (num_moves: int) : int = 
    let new_position=pos in 
     if dir="forward" then new_position=pos+num_moves in 
     else if dir="backward" then new_position=pos-num_moves in 
     if new_position>=99 then 99 
     else if new_position<=0 then 0 
     else new_position 

let test() : bool = 
    (move_robot 10 "forward" 3) = 13 
    ;; run_test "move_robot forward 3" test 

let test() : bool = 
    (move_robot 1 "backward" 4) = 0 
    ;; run_test "move_robot backward 4" test 

回答

4

最有可能是因爲你有語法錯誤無處不在,move_robot從未加載到頂層。消息應該非常明顯,不管你在OCaml中開始函數式編程的概念錯誤是否很常見。

儘管第一個if語句有一個無關的in,它也不應該在其語句中設置變量,但返回一些值。總的來說,你處理W /的方式非常類似於C,如果你修正了第一個語法錯誤,你會立即發現你從未改變過new_position的值。 if語句(以及其他大部分內容)應該返回一個值,而不是嘗試在更大範圍內變更變量 - 一個會使用引用,這在這裏是不必要的。

let new_position = 
    if dir = "forward" then pos+num_moves 
    else if dir = "backward" then pos-num_moves 
    else failwith ("Invalid Direction: "^dir) 
in 

正如您所見,我們永遠不會嘗試修改new_position;這與函數式程序員所喜愛的不變性是一致的。還要注意,如果你不包含最後的else聲明,你會得到一個類型檢查錯誤。排除它是返回unit的語法糖,但您返回一個整數。更妙的是(我認爲通常比if聲明清潔劑)是使用模式匹配,

let new_position = match dir with 
    | "forward" -> pos+num_moves 
    | "backward" -> pos-num_moves 
    | _   -> failwith ("Invalid Direction: "^dir) 
in 

我知道你是新手,那麼你可以離開這一天,但我只是提(不含解釋)您應該使用變體或可能的多態變體,而不是直接檢查字符串。

+0

感謝您的幫助!我的第一語言是C,所以是的;在聲明中用if來聲明變量是很奇怪的想法。 – flymonkey

+0

我知道這是迂腐,但這些都不是變數;他們是價值。變量意味着可變性。 – nlucaroni

+0

它可能同樣迂腐,但這些*是*變量。 50年的術語濫用剛剛使最迫切的程序員忘記了那些在舊的數學意義上實際上意味着什麼。可變類型的變量更準確地稱爲可變引用,單元格或其他同義詞。 ;) –