2017-09-27 8 views
2

, 어떤 data는 다음과 같은 기능 sprintf에 의해 stringify가 될 수 있습니다문자열을 F # 데이터로 구문 분석하는 방법은 무엇입니까? F 번호에

type someKindOfDataType = ... 
let data : someKindOfDataType = ... 
sprintf "%A" data 

우리가 someKindOfDataType 다시 문자열을 구문 분석하는 반전 기능을 가질 수 있습니다, 다음과 같이 :?

let parse<'someKingOfDataType> (s:string) : someKindOfDataType = .... 

javascript의 JSON.parse와 비슷합니까?

답변

2

정상적으로 같은 직렬화 칭한다 어떤 기술 - 그리고 deserialisation - XML, JSON 진 등이 될 수있는 네트워크를 통해 전송 될 수있는 표현으로 메모리 내의 데이터 구조로 변환 - 그 반대입니다.

sprintf "%A"은 일반적으로 생산과는 반대로 개발 목적으로 만 데이터를 시각적으로 표시하기 위해 설계되었습니다. deserialise 할 방법이 없으므로 실제로는 직렬화를 수행하지 않습니다.

F # 데이터를 문자열로 serialize하려면 Newtonsoft.Json과 같은 라이브러리를 통해 JSON을 사용하는 것이 좋습니다.

sprintf "%A"과 같은 F # 소스 코드와 비슷한 문자열은 목적이 다르기 때문에 생성되지 않습니다. 예 :

Newtonsoft.Json.JsonConvert.SerializeObject [|Some 3; None|] 
// """[{"Case":"Some","Fields":[3]},null]""" 

Newtonsoft.Json.JsonConvert.DeserializeObject<int option []> """[{"Case":"Some","Fields":[3]},null]""" 
// [|Some 3; None|] 

당신은에 deserialise하는 유형을 제공해야하고, 문자열이 해당 유형의 유효한 인스턴스를 나타내지 않는 경우이 작업에서 예외를 throw 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 당신의 간단한 예가 당신의 대답이 내가 원하는 것이라는 것을 알려줍니다. –

0

표준 .NET 방식은 일반적으로 구문 분석하려는 유형의 클래스에서 Parse 또는 TryParse 메소드를 사용한다는 것입니다.

그러나 출력 매개 변수를 사용하기 때문에 F # TryParse 함수는 그리 친숙하지 않습니다. 여전히 F # 컴파일러를 사용하면 튜플로 볼 수 있기 때문에 더 나은 결과를 얻을 수 있지만 여전히 옵션을 기대할 수 있습니다. 여기 예입니다 :

let a = Int32.Parse "5" 
let b = 
    match Int32.TryParse "5" with 
    | true, value -> Some value 
    | _   -> None 

당신이 F#+이 두 기능을 가진 라이브러리를 사용하려면 parse 당신을 위해 위의 모든 수행 tryParse : 그것은 종류만큼 작동

#r @"FSharpPlus.dll" 
open FSharpPlus 
open System 

let (a:int) = parse "5" 
let (b:int option) = tryParse "5" 
let (c: Net.IPAddress option) = tryParse "10.0.0.1" 

// val a : int = 5 
// val b : int option = Some 5 
// val c : Net.IPAddress option = Some 10.0.0.1 

Parse 또는 TryParse이 정의되어 있습니다.

+0

답변 해 주셔서 대단히 감사합니다. 도서관과 포스트를 공부하면 행복합니다. F # +에서 인라인 함수 구문 분석에 과부하를 가하는 기술은 흥미롭고 훌륭합니다. convert.fs의 Parser 형식에서 정적 구문 분석 함수로 구현 된 파서를 선택하기 위해 반환 형식을 서명으로 사용할 수 있습니다. 그러나 각 유형을 언급 할 때 파서 함수 만 작성하고 파서 유형을 정의하십시오. 이것은 I가 아닙니다.하지만 귀하의 답변에 다시 한 번 감사드립니다. –