0

さて、私はOCamlの使用semicolon (single and double)と使用に問題があります。nested if else

例えば


let union u p q = 
  let rec unionfy id_ary i =
    if i < Array.length id_ary then begin 
      if id_ary.(i) = p then begin 
        id_ary.(i) <- id_ary.(q);
        print_array id_ary 0;
      end
      unionfy id_ary (i + 1);
    end 
    else print_string "end of union";
  in
  unionfy u.id_ary 0;;

コンパイラは言ったline 18, characters 29-95: Error: This expression is not a function; it cannot be applied

問題のある行は ですがif id_ary.(i) = p then begin、理由がわかりません。


また、誰でもsemicolon物事についてもっと教えてもらえnested if elseますか?

ここに私の心の中でいくつかの質問があります:

  1. いつ使用しsingle semicolonますか? 複数の式に使用する場合double semicolon、最後の式の後に a を追加する必要がありますか?
  2. begin end内部で複数使用できますnested ifか?

  3. else結果がunit and do nothing?の場合、追加する必要はないようです。

4

1 に答える 1

5

問題はendです。この場合、式全体ifが返されるはずunitなので、式の最後にセミコロンが必要です。式が句を継続しているため、もう一方endはそれを必要としません。以下では、不要なセミコロンを削除し、残りのセミコロンを追加しました。ifelse

let union u p q = 
  let rec unionfy id_ary i =
    if i < Array.length id_ary then begin 
      if id_ary.(i) = p then begin 
        id_ary.(i) <- id_ary.(q);
        print_array id_ary 0
      end;
      unionfy id_ary (i + 1)
    end 
    else print_string "end of union"
  in
  unionfy u.id_ary 0;;

編集:「ルール」は実際にはOCamlのセミコロンの定義です。を返すシーケンシャル式を区切りunitます。間の内容begin ... endは特異な表現です。式全体ifも式ですが、複数の式で構成されています。したがって、最初のifステートメントに含まれる2つのステートメントは次のとおりです。

  if id_ary.(i) = p then begin ... end;
  unionfy id_ary (i + 1)
于 2013-02-07T17:35:19.890 に答える