是否可以通过将数据绑定到单个值而不是元组来解压缩类型?
# 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"
这在语法上是否可行?
答案 0 :(得分:9)
这是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
期望一个值是一个元组。这可以更灵活,但它也需要更多的内存来表示它,并且需要更长的时间来访问这些部分。