2012-04-24 3 views
5

데이터를 튜플이 아닌 단일 값에 바인딩하여 형식의 압축을 해제 할 수 있습니까?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");; 
- : 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

[가능한 한 개의 튜플 값을 가진 변형 유형 생성자 사용] (http://stackoverflow.com/questions/9774671/using-a-variant-type-constructor-with-just-one-tuple-value) – ygrek

답변

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는 튜플의 하나 값을 기대하고있다. 이것은보다 융통성이있을 수 있지만이를 표현하는 데 조금 더 많은 메모리가 필요하며 부품에 액세스하는 데 약간 시간이 걸립니다.

관련 문제