5

タプルではなく単一の値にデータをバインドすることで型をアンパックできますか?

# type foo = Foo of int * string;;
type foo = Foo of int * string
# Foo (3; "bar");;
  Foo (3; "bar");;
Error: The constructor Foo expects 2 argument(s),
       but is applied here to 1 argument(s)
# Foo (3, "bar");;
- : foo = Foo (3, "bar")

# (* Can this possibly work? *)
# let Foo data = Foo (3, "bar");;
  let Foo data = Foo (3, "bar");;
Error: The constructor Foo expects 2 argument(s),
       but is applied here to 1 argument(s)

# (* Here is the version that I know works: *)
# let Foo (d1, d2) = Foo (3, "bar");;
val d1 : int = 3
val d2 : string = "bar"

これは構文的に可能ですか?

4

1 に答える 1

9

これは、OCaml 構文のトリッキーな部分です。示されているように型を定義すると、そのコンストラクターFooは括弧内に 2 つの値を期待します。タプルは単一の値ではなく、常に 2 つの値でなければなりません。

別のタイプを使用したい場合は、もっと好きなことをすることができます:

# type bar = Bar of (int * string);;
type bar = Bar of (int * string)
# let Bar data = Bar (3, "foo");;
val data : int * string = (3, "foo")
# let Bar (d1, d2) = Bar (3, "foo");;
val d1 : int = 3
val d2 : string = "foo"

このように宣言すると、コンストラクターはタプルである1 つBarの値を期待します。これはより柔軟にできますが、それを表現するために少し多くのメモリを必要とし、パーツにアクセスするのに少し時間がかかります。

于 2012-04-24T22:20:39.977 に答える