OCaml constructor unpacking

最后都变了- 提交于 2019-12-10 13:53:20

问题


Is it possible to unpack a type by binding its data to a single value instead of a tuple?

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

Is this syntactically possible?


回答1:


This is a tricky part of OCaml syntax. If you define your type as you show, its constructor Foo expects two values in parentheses. And it always has to be two values, it's not a single value that's a tuple.

If you're willing to use a different type, you can do something more like what you want:

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

When declared this way, the constructor Bar expects one value that's a tuple. This can be more flexible, but it also takes a little more memory to represent it, and a little longer to access the parts.



来源:https://stackoverflow.com/questions/10306733/ocaml-constructor-unpacking

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!