2013-06-15 14 views
7

W SML, mogę używać Printf.printf do wyjściowego sformatowany ciąg, jakJak uzyskać sformatowany ciąg znaków w OCaml?

Printf.printf "Hello %s %d\n" world 123 

Jednak printf jest rodzajem wyjścia.


To, czego chcę, nie jest dla wyjścia, ale dla łańcucha znaków. Na przykład, chcę

let s = something "Hello %s %d\n" "world" 123 

wtedy mogę dostać s = "Hello World 123"


W jaki sposób można to zrobić?

Odpowiedz

12

Można użyć Printf.sprintf:

# Printf.sprintf "Hello %s %d\n" "world" 123;; 
- : string = "Hello world 123\n" 
+0

Czy mogę zdefiniować tak: 'let fmt =" Hello% s% d \ n ";; Printf.sprintf fmt "world" 123'? –

+3

@JacksonTale, nie jestem pewien. Wygląda na to, że możesz zrobić 'let fmt = Printf.sprintf" Hello% s% d \ n ";; fmt "world" 123 ;; jednak. – zch

+0

@JacksonTale: jeśli zrobisz to w ten sposób, wywnioskuje on niewłaściwy typ (ciąg zamiast formatu). W OCaml występuje "przeciążenie" literałów ciągów między ciągami i formatami. Aby wywnioskować, co trzeba, należy użyć 'format_of_string' (który jest funkcją identyfikującą, ale pomaga systemowi typu):' let fmt = format_of_string "Hello% s% d \ n" ;; Printf.sprintf fmt "world" 123'. A może możesz po prostu zrobić '(fun fmt -> Printf.sprintf fmt" world "123)" Hello% s% d \ n "' jeśli to wystarcza. – newacct

5

Można to zrobić:

$ ocaml 
     OCaml version 4.00.1 

# let fmt = format_of_string "Hello %s %d";; 
val fmt : (string -> int -> '_a, '_b, '_c, '_d, '_d, '_a) format6 = <abstr> 
# Printf.sprintf fmt "world" 123;; 
- : string = "Hello world 123" 

format_of_string funkcja (jak sama nazwa wskazuje) przekształca ciąg dosłowne w formacie. Zauważ, że formaty muszą być ostatecznie zbudowane z literałów łańcuchowych, ponieważ w grę wchodzi magia kompilatora. Nie można odczytać ciągu i użyć go jako formatu, na przykład. (Nie byłby to system typu "safe").

Powiązane problemy