2017-12-06 1 views
1

나는 두 JsonProvider 유형이 있습니다패스 "일반적인"JsonProvider는 F #으로 작동하려면

type Provider1 = JsonProvider<"""{structure}"""> 
type Provider2 = JsonProvider<"""{}structure2"""> 

내가 JsonProvider 제공하여, 즉 다음 중 하나를 수용하고 JSON을 구문 분석 할 수있는 기능을 가지고 싶습니다 같은 것을 : 당신은 정적으로 해결 된 유형 매개 변수 (SRTPs)와 인라인 함수를 정의 할 수 있습니다

let parseUsingSpecificProvider json (provider : JsonProvider<GENERIC>) = 
    provider.Parse json 

답변

2

(컴파일되지 의사 코드) :

let inline parseUsingSpecificProvider json (provider:^T) = 
    (^T : (static member Parse : string -> _) json) 

// tests 
#r @"packages\FSharp.Data\lib\net40\FSharp.Data.dll" 
open FSharp.Data 

type Provider1 = JsonProvider<""" { "name":"John"   } """> 
type Provider2 = JsonProvider<""" { "name":"John", "age":94 } """> 

let x = parseUsingSpecificProvider (""" { "name":"Tomas", "age":4 } """) Unchecked.defaultof<Provider1> 
let y = parseUsingSpecificProvider (""" { "name":"Tomas", "age":4 } """) Unchecked.defaultof<Provider2> 
,

정적 메서드 Parse이 입력으로 문자열을 수락하는 모든 형식에서 작동합니다.

0

함수 프로그래밍에서는 '단일 함수 인터페이스'를 함수 자체로 바꾸는 것이 일반적입니다. 나는. 당신이 제공된 유형의 여러 가지 방법을해야하는 경우

#r @"packages\FSharp.Data\lib\net40\FSharp.Data.dll" 
open FSharp.Data 

type Provider1 = JsonProvider<""" { "name":"John"   } """> 
type Provider2 = JsonProvider<""" { "name":"John", "age":94 } """> 

let parse parseFn json = 
    parseFn json 

let p1 = parse Provider1.Parse """{ "name": "Not John" }""" 
let p2 = parse Provider2.Parse """{ "name": "Not John either", "age": 12 }""" 

, 당신은 사용할 수 있습니다 예를 들면 : 대신 Parse 방법을 갖는 파서에 전달하는 단지 최고 수준의 값으로 Parse 기능을 사용 필요한 모든 데이터를 포함하는 기록 :

type Parser<'b> = { 
    Parse : string -> 'b 
    GetSample : unit -> 'b 
} 

let parseUsing parser text = 
    printfn "Parsing things like %A" <| parser.GetSample() 
    parser.Parse text 

let parser1 = { Parse = Provider1.Parse; GetSample = Provider1.GetSample } 
let parser2 = { Parse = Provider2.Parse; GetSample = Provider2.GetSample } 

let p1' = parseUsing parser1 """{ "name": "Not John" }""" 
let p2' = parseUsing parser2 """{ "name": "Not John either", "age": 12 }""" 

SRTPs 강력한 (멋진) 동안, 그들의 사용은 제한되어야한다. 과용은 컴파일러의 속도를 늦추고 코드를 이해하기 어렵게 만듭니다.