2013-06-15 17 views
7

In OCaml, posso usare Printf.printf di output formattato stringa, comeCome ottenere una stringa formattata in OCaml?

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

Tuttavia, printf è una sorta di uscita.


Ciò che desidero non è per l'output, ma per una stringa. Per esempio, io voglio

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

quindi posso ottenere s = "Hello World 123"


Come posso fare questo?

risposta

12

È possibile utilizzare Printf.sprintf:

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

posso definire così: 'let fmt =" Ciao% s% d \ n ";; Printf.sprintf fmt "world" 123'? –

+3

@JacksonTale, non sono proprio sicuro. Sembra che tu possa fare "let fmt = Printf.sprintf" Hello% s% d \ n ";; fmt "world" 123 ;; 'tuttavia. – zch

+0

@JacksonTale: se lo fai in questo modo, dedurrà il tipo sbagliato (stringa anziché formato thingy). In OCaml c'è un "sovraccarico" di stringhe letterali tra stringhe e cose di formato. Per inferire la cosa giusta, devi usare 'format_of_string' (che è una funzione di identificazione, ma aiuta il sistema di tipi):' let fmt = format_of_string "Hello% s% d \ n" ;; Printf.sprintf fmt "world" 123'. O forse puoi semplicemente fare '(fun fmt -> Printf.sprintf fmt" world "123)" Hello% s% d \ n "' se è sufficiente. – newacct

5

Si può fare questo:

$ 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" 

La format_of_string funzione (come dice il nome) trasforma una stringa letterale in un formato. Si noti che i formati devono essere generati in definitiva da stringhe letterali, perché è coinvolta la magia del compilatore. Ad esempio, non puoi leggere una stringa e usarla come formato. (Non sarebbe tipologico.)

Problemi correlati