2013-02-21 1 views
6

F # Interactive (fsi)에서는 AddPrinter 또는 AddPrinterTransformer을 사용하여 대화 형 세션의 유형에 대해 예쁜 인쇄를 제공 할 수 있습니다. 제네릭 형식의 프린터를 추가하려면 어떻게합니까? 유형에 와일드 카드 _를 사용하면 작동하지 않습니다제네릭 형식의 예쁜 프린터를 fsi에 추가하려면 어떻게합니까?

> fsi.AddPrinter(fun (A : MyList<_>) -> A.ToString());; 

프린터는 사용되지 않습니다. 하나, 내가 원하는 것이 아니다

> fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());; 

    fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());; 
    -------------------------------^^ 

d:\projects\stdin(70,51): warning FS0064: This construct causes code 
to be less generic than indicated by the type annotations. The type 
variable 'T been constrained to be type 'obj'. 

: 형식 매개 변수에 넣는

는 경고를 표시합니다.

+2

저는 이것이 가능하지 않을 것이라고 확신합니다. 형식 인수에는 구체적인 형식이 필요합니다. – Daniel

+0

'MyList <'T>'에 대해'ToString'을 오버라이드 할 수 있습니까? – Daniel

답변

7

일반적인 경우에는 작동하지 않지만 자신의 유형으로 작업하고있는 것으로 보입니다 (적어도 귀하의 예에서는) ToString에 영향을 미치지 않는다고 가정하면 다음과 같이 할 수 있습니다. 이 :

type ITransformable = 
    abstract member BoxedValue : obj 

type MyList<'T>(values: seq<'T>) = 
    interface ITransformable with 
    member x.BoxedValue = box values 

fsi.AddPrintTransformer(fun (x:obj) -> 
    match x with 
    | :? ITransformable as t -> t.BoxedValue 
    | _ -> null) 

출력 :

> MyList([1;2;3]) 
val it : MyList<int> = [1; 2; 3] 

타사 일반적인 당신이 AddPrintTransformer 사용할 수있는 유형 및 반사의 경우는 값을 표시 할 수 있습니다. 소스가 있다면 인터페이스가 더 쉽습니다.

+0

감사합니다. 하지만 왜 'AddPrintTransformer'의 매개 변수에'obj'라는 타입을 선언합니까? ITTLformable을 직접 사용하지 않는 이유는 무엇입니까? 아니면'ITransformable'을 취하는 함수로'AddPrinter'를 사용합니까? –

+0

처음으로 반사경을 사용하기 시작했기 때문에 'obj'입니다. 당신은 아마도 그것을 'ITransformable'로 변경할 수 있습니다. 나는'AddPrintTransformer'가 대부분의 경우 표시 가능한 값으로 위임하는 것만으로 충분하기 때문에 수행하려고하는 것이 더 낫다고 생각합니다. – Daniel

관련 문제