2017-12-24 29 views
2

나는 Printf.sprintf의 결과를 다른 함수 (예 : f)에 끼워 넣는 경우가 많이 있습니다. 나는 다음과 같이 두 가지의 구성 printf을 정의하기 위해 노력 해왔다 :`printf.sprintf` 함수를 다른 함수로 작성하기

let printf : 'a 'b. ('a,unit,string) format -> 'b = 
    (fun fmt -> Printf.sprintf fmt) |> f 

그러나,이 유형 체킹하지 않으며,도 Obj.magic의 여러 응용 프로그램과 그 버전을 수행합니다. "custom printf"를 얻는 올바른 방법은 무엇입니까?

+0

앞에서''a 'b .'없이 시도하십시오. –

답변

8

Obj.magic을 사용하지 마십시오. 형식 문자열의 특별한 입력이 가변 printf을 달성하기에, 당신은 간단한 함수 구성하여 같은 일을 쓸 수 없습니다 인해

이 어려움을 극복하기 위해

let sprintf_then_f fmt args ... = f (Printf.sprintf fmt args ...) 

Printfk (kontinuation)에서와 연속 스타일의 기능을 제공합니다 이름은 Printf.ksprintf입니다. 그들을 사용하십시오 :

val ksprintf : (string -> 'd) -> ('a, unit, string, 'd) format4 -> 'a 
(** Same as [sprintf] above, but instead of returning the string, 
    passes it to the first argument. 
    @since 3.09.0 
*) 
+1

4.02 이후 형식 문자열은 내부적으로 GADT로 구현되며, "% s"는 "CamlinternalFormatBasics. (Format (String (No_padding, End_of_format)" "% s")에 대한 구문 설탕입니다. 형식 문자열의 입력에서 형식 문자열 및 문자열 리터럴의 유형 중심의 모호성 제거가 있습니다. – octachron