2015-01-08 5 views
2

지도 또는 시퀀스와 같은 내장 컬렉션에서 tostring 기능을 재정의하려면 어떻게해야합니까? printfn에서이 새로운 맞춤형 tostring 기능을 사용하게하려면 어떻게해야합니까?내장 컬렉션에서 tostring을 재정의하는 방법

나는

type seq<'T> with 
    override xs.Tostring() = 
     "blabla" 

그러나 이것은 단지 오류 "유형 약어 보강을 가질 수 없습니다"제공 무언가 같이해야한다 생각합니다.

나는 다음 http://msdn.microsoft.com/en-us/library/dd233211.aspx

내가

type System.Int32 with 
    member this.FromString(s : string) = 
     System.Int32.Parse(s) 

type seq<'T> with 
    /// Repeat each element of the sequence n times 
    member xs.RepeatElements(n: int) = 
     seq { for x in xs do for i in 1 .. n do yield x } 

먼저 예를 다음과 같이 예를 들어 INT32 및 시퀀스 확장 할 수 있어야한다는 내용의 대한 그러나 잘 작동 형의 확장에 대해 다음 MSDN 보았다 발견 두 번째 하나는 그냥 "타입 약어는 회원을 가질 수 없다"는 오류 메시지가 나타납니다..

나는 현재 닷넷 4.5.1 및 F 번호 3.1

+0

일반적으로 .NET에서 수행 할 수 없습니다. [이 질문에 대한 답변] (http://stackoverflow.com/questions/9697332/how-can-ioverride) -tostring-method-for-all-ienumarableint32). 그러나'printfn'을 다시 정의하여 그렇게 할 수 있습니다. – Gustavo

답변

6

유형의 확장을 사용하고는 더 많거나 적은 같은 확장 회원 생각할 수 있습니다. 유형을 만들지 않으므로 언어가 사용자가 기존의 유형의 일부로 보이는 구문으로 소비하도록 허용하는 메소드, 속성 등을 선언하는 것입니다.

진정한 재정의는 멤버를 재정의하려는 사람으로부터 상속받은 새 클래스를 만든 경우에만 수행 할 수 있습니다.

F # 컬렉션 유형은 봉인되거나 공개되지 않습니다 (또는 둘 모두). 따라서이 작업을 수행 할 수 없습니다. 어쨌든 이러한 유형은 컴파일러/런타임 전체에 하드 와이어되어 있기 때문에 아마도 잘 작동하지 않을 것입니다.

type myList<'t>() = 
    inherit list<'t>() // error FS0945: Cannot inherit a sealed type 
    override this.ToString() = "woooo" 

다양한 방법으로 해결할 수 있지만 원활하지는 않습니다. 다음은 꽤 잘 작동하는 기본 접근법입니다.

module CustomStr = 
    type ToStringWrapper(toString) = 
     override this.ToString() = toString() 

    let list lst = ToStringWrapper(fun _ -> lst |> List.map (sprintf "[%O]") |> String.concat "") 
    let seq s = ToStringWrapper(fun _ -> s |> Seq.map (sprintf "{%O}") |> String.concat "") 



{1..3} |> CustomStr.seq |> printfn "%A" 
[1;2;3] |> CustomStr.list |> printfn "%A" 

// {1}{2}{3} 
// [1][2][3] 
관련 문제