2014-12-08 1 views
2

F #에서 복합 * 유형을 만드는 방법을 배우고 있는데 문제가 발생했습니다. 이 형식 및 ToString 재정의 있습니다.F #의 복합 유형에서 ToString을 어떻게 재정의합니까?

type MyType = 
    | Bool of bool 
    | Int of int 
    | Str of string 
    with override this.ToString() = 
      match this with 
      | Bool -> if this then "I'm True" else "I'm False" 
      | Int -> base.ToString() 
      | Str -> this 

let c = Bool(false) 
printfn "%A" c 

"이 생성자는 0 인수에 적용되지만 1을 기대합니다"라는 ToString 재정의 내부에는 오류가 발생합니다. 나는이 코드가 컴파일되지 않을 것이라고 확신했지만, 내가하려고하는 것을 보여준다. 재정의를 주석 처리하고 코드를 실행하면 c이 "val c : MyType = Bool false"로 인쇄됩니다. 그 코드에 들어가면, c가 부울 으로 설정된 Item 속성을 가지고 있음을 알 수 있습니다. 그러나 코드에서이 속성에 액세스 할 수 없습니다. c에 주석을 달아도.

이 상황에서 ToString을 어떻게 재정의해야합니까?

* 저는 이것이 복합 유형이라고 확신합니다.

답변

5

당신이, 당신이이 같은 경기 문에서 값을 압축을 풀 필요가있다 (즉, 해당 유형에 대한 적절한 이름이다)는 Discriminated Union (DU)를 사용하는 경우 :

type MyType = 
    | Bool of bool 
    | Int of int 
    | Str of string 
    with override this.ToString() = 
      match this with 
      | Bool(b) -> if b then "I'm True" else "I'm False" 
      | Int(i) -> i.ToString() 
      | Str(s) -> s 

let c = Bool(false) 
printfn "%A" c 

Item 속성을 당신 ' 다시 볼 때 구현 세부 사항이며 F # 코드에서 액세스 할 수 없습니다. this을 사용하는 것은 DU가 값을 감싸는 래퍼이기 때문에 작동하지 않습니다. 따라서 this은 포함 된 값이 아니라 래퍼를 참조합니다.

관련 문제