2
let rec move_robot (pos: int) (dir: string) (num_moves: int) : int =

    let new_forward_position = pos + num_moves in
    if (new_forward_position > 99) then failwith "cannot move beyond 99 steps"
    else new_forward_position

    let new_backward_position = pos - num_moves in
    if (new_backward_position pos < 0) then failwith "cannot move less than 0 steps"
    else new_backward_position

    begin match dir with 
    | "forward" -> new_forward position
    | "backward" -> new_backward_position
    end

let new_backward_position 行で「予期しないトークン」が引き続き取得されます。私のエラーは何ですか?

4

2 に答える 2

3

コンパイルするコードは次のとおりです。

let rec move_robot pos dir num_moves =
    let new_forward_position = pos + num_moves in
    if new_forward_position > 99 then failwith "cannot move beyond 99 steps";

    let new_backward_position = pos - num_moves in
    if new_backward_position < 0 then failwith "cannot move less than 0 steps";

    begin match dir with
    | "forward" -> new_forward_position
    | "backward" -> new_backward_position
    end

私はいくつかのことを変更しました:

  • 重要:if foo then bar else quxは OCaml の式で、値barまたはのいずれかを取りますqux。したがって bar、 とquxは同じタイプである必要があります。
  • new_backward_positionそれ以外のnew_backward_position pos
  • 型注釈は必要ありません: OCaml には型推論があります
  • if 句を括弧で囲む必要はありません
  • タイプミスnew_forward position

また、コードのロジックではlet _ = move_robot 0 "forward" 5失敗します。代わりに 5 を返すべきではありませんか? の合計型を定義し、pos最初にパターン マッチングを行うことをお勧めします。

于 2013-01-19T23:11:26.467 に答える
2

エラーが発生しないと仮定すると、コードは次の基本構造を持ちます。

let f () =
    let p = 3 in p
    let q = 5 in q
    ...

何をしようとしているのかは明確ではありませんが、これは整形式の OCaml ではありません (コンパイラが教えてくれます)。たぶん、あなたが欲しいのは次のようなものです:

let f () =
    let p = 3 in
    let q = 5 in
    match ...

その場合、 をifの前に移動する必要がありますin

let f () =
    let p = if badp then failwith "" else 3 in
    let q = if badq then failwith "" else 5 in
    match ...

または多分これはあなたが望むものです:

let f () =
    let p = 3 in
    let () = if badp p then failwith "" in
    let q = 5 in
    let () = if badq q then failwith "" in
    match ...

(これがお役に立てば幸いです。)

于 2013-01-19T23:13:09.703 に答える