2

私は書いmyPercolation.mlた。

open MyUnionFind

module type MyPercolationSig = sig
  type percolation
  val create_percolation : int -> percolation
  val open_site : percolation -> int -> int -> unit
  val is_open : percolation -> int -> int -> bool
  val is_full : percolation -> int -> int -> bool
  val can_percolates : percolation -> bool
end

module MyPercolation : MyPercolationSig = struct

  exception IndexOutOfBounds;;

  type percolation = 
      {n : int; 
       sites: bool array; 
       union : MyUnionFind.union_find};;

  let create_percolation n = 
    {n = n; sites = Array.make (n*n) false; union = MyUnionFind.create_union (n*n)};;

  let open_site p i j = 
    let {n;_;union} = p 
    in 
    if not (is_open p i j) then
      begin 
    sites.(index_of n i j) <- true;
    if i - 1 >= 1 && i - 1 <= n && is_open n (i-1) j then
      MyUnionFind.union union (index_of n i j) (index_of n (i-1) j)
    else  if i + 1 >= 1 && i + 1 <= n && is_open n (i+1) j then
      MyUnionFind.union union (index_of n i j) (index_of n (i+1) j)
    else  if j - 1 >= 1 && j - 1 <= n && is_open n i (j-1) then
      MyUnionFind.union union (index_of n i j) (index_of n i (j-1))
    else  if j + 1 >= 1 && j + 1 <= n && is_open n i (j+1) then
      MyUnionFind.union union (index_of n i j) (index_of n i (j+1))
      end;;

  let index_of n i j = n * (i - 1) + j;;

  let is_open {n;sites;_} i j = 
    if i < 1 || i > n || j < 1 || j > n then 
      raise IndexOutOfBounds
    else 
      sites.(index_of n i j);;

  let is_full {n;_;union} i j =
    let rec is_connected_top j' =
      if j = 0 then false
      else 
    if MyUnionFind.is_connected union (index_of n i j) (index_of n 0 j') then true
    else is_connected_top (j'-1)
    in is_connected_top n;;

  let can_percolates p =
    let {n;_;_} = p 
    in  
    let rec is_full_bottom j =
      if j = 0 then false
      else 
    if is_full p n j then true
    else is_full_bottom (j-1)


end

パッケージパッケージは無視してくださいMyUnionFindunion-findこれは、アルゴリズムの自家製の実装にすぎません。

をコンパイルしようとするとmyPercolation.ml、次のようなエラーが発生します。

$ ocamlc -c myPercolation.ml
File "myPercolation.ml", line 25, characters 11-12:
Error: Syntax error: '}' expected
File "myPercolation.ml", line 25, characters 8-9:
Error: This '{' might be unmatched

let {n;_;union} = pエラーはの関数で話していると思いますlet open_site p i j

その行とすべてのコードを何度も読みましたが、それでもその行に不一致は見られません{}

誰か助けてもらえますか?

4

2 に答える 2

4

もう1つの考えられるエラー:{n;_;_}必要{n;_}なアンダースコアは1つだけです。_一致ステートメントのワイルドカードのように考えてください。

于 2013-02-19T01:00:07.563 に答える
3

発現let {n; _; union} = pはよく形成されたOCamlではありません。私はあなたが欲しいものはだと思いますlet {n; union} = p。レコードパターンで気にしないフィールドを処理する方法は、それらについて言及することではありません。

更新

rgrinbergが指摘しているように、問題を説明するためのはるかに優れた方法は、_が最後のフィールドとして表示される必要があることです。そのため、コンパイラーは}後で確認することを期待しています。_レコードのフィールドのサブセットのみを意図的に照合していることを示すインジケーターとしてを含めるのが良いスタイルかもしれません。実際、これをチェックするコンパイラオプションをオンにすることができます。

アップデート2

不完全なレコードパターンの警告は警告番号9であり、文字Rにも関連付けられています。Rの使用方法は次のとおりです。

$ ocaml -w +R
        OCaml version 4.00.0

# type r = { a: int; b: char };;
type r = { a : int; b : char; }
# let {a} = {a=3; b='x'} in a;;
Warning 9: the following labels are not bound in this record pattern:
b
Either bind these labels explicitly or add '; _' to the pattern.
- : int = 3

コマンドライン構文はコンパイラでも同じです。

于 2013-02-19T00:37:17.840 に答える