2011-08-17 2 views
10

다음 코드는 컴파일되지 않습니다. 선택적 인수 전파

type A(?arg) = 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) //ERROR expected type string but has type 'a option 

나는 옵션의 기본 유형의 인스턴스를 제공해야하기 때문에이 가정, 그리고 컴파일러는 구문에 따라 Some/ None를 건네주는 처리를합니다.

제 가정을 올바르게 가정했다고 가정하고 이에 대한 해결 방법이 있습니까? 선택적 인수를 전달할 수 있습니까?

답변

21

F 번호 사양 8.13.5 선택적 인수

다음 방법을 사용하여 선택적 인수에 대한 값을 지정할 수 있습니다

발신자 : 이름으로

  • 을 예 : arg2 = 1 또는? arg2 = Some (3) 또는? arg2 = arg2와 같이 기존 선택적 값을 이름으로 전파함으로써. 이는 선택적 인수를 다른 인수에 전달하는 하나의 메소드를 빌드 할 때 유용 할 수 있습니다.
  • 위치와 일치하는 이름이없는 일반 인수를 사용합니다. 가능한입니다

    type A(?arg) = 
        member __.Arg : string option = arg 
    
    type B(?arg) = 
        inherit A(?arg = arg) 
    
    printfn "1. %A" (B()).Arg // None 
    printfn "2. %A" (B("1")).Arg // Some "1" 
    
    printfn "3. %A" (A()).Arg // None 
    printfn "4. %A" (A("1")).Arg // Some "1" 
    
+0

좋습니다. 당신은 너무 많은 사양을 읽었습니다. 왜이 작동합니까? – Daniel

+0

신경 쓰지 마세요. 나는 그것을 스펙에서 발견했다. 나는 약간의 시간을 읽어야한다. – Daniel

+0

고마워 ... 가끔 구문은 간단합니다;) – Carsten

1

죄송합니다. 먼저 테스트해야합니다. 귀하가 옳은 것 같습니다. - "해야합니까?" 너 자신을 위해 : 방법 회원들에게

type A(arg : string option) = 
    new (a) = new A(Some a) 
    new() = new A(None) 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) 
+0

. 감사. A에 옵션 args를 유지하면서 누군가가 작동하게하는 방법을 제안 할 수 있는지 기다릴 것입니다. – Daniel

+0

두 번째 생각에 이것은 선택적인 args가 전파 될 수 없음을 의미합니다. 생성자에게 전달되는 동일한 선택적 arg를 사용하여 메소드 또는 파생 클래스를 가질 수 없습니다 (다소 제한적 임). 매번 올바른 생성자 오버로드로 분기해야합니다. – Daniel

+0

버그가있을 수 있습니다 - 인수 arg (with?)가 문자열 옵션이지만 new의 정의에 문자열이 있습니다 - 아마도 우리가 사례를 제출해야합니까? – Carsten