문제

일반 유형에 대한 다양한 확장 방법을 작성하려고합니다. 특정 일반 유형 매개 변수에 결합합니다 F#에서는 언어가 나를 허용하지 않는 것 같습니다.

내가하고 싶은 것은 다음과 같은 것입니다.

type IEnumerable<int> with
    member this.foo =
        this.ToString()

그러나 그것은 컴파일러 오류를 제공합니다 (밑줄 int 예어):

유형 이름의 예기치 않은 식별자. 예상 된 Infix 연산자, 견적 기호 또는 기타 토큰.

다음과 같은 하다 작동하지만 일반 유형 매개 변수를 구체적으로 바인딩하지는 않지만 int, 내가 원하는대로 :

type IEnumerable<'a> with
    member this.foo =
        this.ToString()

F# 에서이 목표를 달성 할 수있는 방법이 있습니까? 아마도 잘못된 구문을 사용하고 있습니까? 그렇지 않다면, 누군가가 해결 방법을 제안 할 수 있고, 어딘가에 유형의 제약을 사용하는 경우에 감사드립니다.

도움이 되었습니까?

해결책

불행히도 F#의 현재 버전에서는 불가능합니다. 관련 질문을 참조하십시오 여기.

다른 팁

일반 확장 방법은 이제 F# 3.1에서 사용할 수 있습니다.

open System.Runtime.CompilerServices
open System.Collections.Generic

[<Extension>]
type Utils () =
    [<Extension>]
    static member inline Abc(obj: IEnumerable<int>) = obj.ToString()

printfn "%A" ([1..10].Abc())

글쎄, 당신은 제약 조건을 사용할 수 있지만 int와 같은 밀봉 된 유형은 아닙니다.

type IEnumerable<'a when 'a :> InheritableType> =
member this.Blah =
    this.ToString()

흠...

유사한 솔루션을 찾는 다른 사람들을 돕기 위해 유형 제약 조건으로 일반적인 확장 방법을 사용하는 방법을 보여주는 예가 있습니다. 아래의 예에서는 유형 인수가 기본 생성자를 노출 해야하는 유형 제약 조건이 있습니다. 이것은 그것을 사용하여 수행됩니다 [<CLIMutable>] 속성에 적용됩니다 Order 기록. 또한 메소드의 결과를 통과 한 유형에 제한하고 있습니다.

확장 방법을 사용하려면 사용하려는 유형을 지정해야합니다. 또한 일반 사전 인터페이스를 확장하고 있습니다.

[<Extension>]
type ExtensionMethds () = 

    [<Extension>]
    static member inline toObject<'T when 'T: (new: unit -> 'T)> (dic: IDictionary<string,obj>): 'T =
        let instance = new 'T()
        // todo: set properties via reflection using the dictionary passed in
        instance


[<CLIMutable>]
type Order = {id: int}

let usage = 
    let dictionaryWithDataFromDb = dict ["id","1" :> obj] 
    let theOrder = dictionaryWithDataFromDb.toObject<Order>()
    theOrder
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top