2012-04-24 4 views
5

Có thể giải nén một loại bằng cách liên kết dữ liệu của nó với một giá trị duy nhất thay vì một bộ tuple không?Thi công hàm OCaml giải nén

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

Cú pháp này có thể thực hiện được không?

+0

bản sao có thể có của [Sử dụng hàm tạo kiểu biến thể chỉ với một giá trị tuple] (http://stackoverflow.com/questions/9774671/using-a-variant-type-constructor-with-just-one-tuple-value) – ygrek

Trả lời

9

Đây là một phần phức tạp của cú pháp OCaml. Nếu bạn xác định loại của mình khi bạn hiển thị, hàm tạo của nó Foo sẽ mong đợi hai giá trị trong dấu ngoặc đơn. Và nó luôn luôn có hai giá trị, nó không phải là một giá trị duy nhất đó là một tuple.

Nếu bạn sẵn sàng để sử dụng một loại khác nhau, bạn có thể làm một cái gì đó giống như những gì bạn muốn:

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

Khi tuyên bố cách này, các nhà xây dựng Bar hy vọng một giá trị đó là một tuple. Điều này có thể linh hoạt hơn, nhưng nó cũng mất nhiều bộ nhớ hơn một chút để đại diện cho nó, và lâu hơn một chút để truy cập vào các bộ phận.