2012-01-19 7 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がトップレベルに読み込まれていない可能性があります。 Syntax Error OCamlでの関数型プログラミングの開始には、概念的な間違いがあるにもかかわらず、メッセージはかなり明白です。

最初のifステートメントには無関係のinがありますが、ステートメントに変数を設定してはなりませんが、値は返されます。一般的に、あなたがw /を扱う方法はnew_positionと非常によく似ています。最初の構文エラーを修正した場合は、new_positionの値を決して変更していないことがすぐわかります。ステートメント(とほとんどの場合、他のもの)は値を返すべきであり、より大きなスコープで変数を変更しようとしません。ここでは参照を使用しますが、ここでは必要ありません。

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を返すが、整数を返す。私はあなたが出始めている知っているので、あなたは別の日にこれを残すことができますが、私はちょうど(なしに言及します

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

、パターンマッチングを使用することです(と私はifの文よりも、通常はきれいだと思う)さらに良いです説明)、文字列を直接チェックするのではなく、多変量や多型を使用するべきです。

+0

助けてくれてありがとう!私の最初の言葉はCでした。宣言の中でifを使って変数を宣言するのはとても奇妙な考えです。 – flymonkey

+0

私はこれが賢明だと知っていますが、これらは変数ではありません。彼らは価値です。変数は変更可能性を意味します。 – nlucaroni

+0

これはおそらく同様に賢明ですが、これらは*変数です。 50年にわたる専門用語の乱用は、ほとんどの命令的プログラマーに、それが実際に古い古くからの数学的意味での意味を忘れてしまったばかりです。変更可能な種類の変数は、より正確には、変更可能な参照、セル、または他の同義語と呼ばれます。 ;) –

関連する問題