Syntax OCaml构造函数解包

Syntax OCaml构造函数解包,syntax,ocaml,Syntax,Ocaml,是否可以通过将类型的数据绑定到单个值而不是元组来解包类型 # 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");; - :

是否可以通过将类型的数据绑定到单个值而不是元组来解包类型

# 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"

这在语法上是可能的吗?

这是OCaml语法中一个棘手的部分。如果按照显示的方式定义类型,则其构造函数
Foo
需要两个括号中的值。它必须是两个值,不是一个值,而是一个元组

如果您愿意使用不同的类型,您可以做一些更像您想要的事情:

# 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"
当以这种方式声明时,构造函数
Bar
需要一个元组值。这可能更灵活,但表示它也需要更多的内存,访问部件也需要更长的时间。

的可能重复