2016-06-22 9 views
1

Я пытаюсь понять и использовать Format.fprintf для куска кода в модуле. У меня есть функция, как этотКак вернуть довольно печатную строку с использованием функции Format.fprintf?

let some_function fmt s = match s with 
    | For(exp,_) -> Format.fprintf fmt "something here" 
    | Assume x-> Format.fprintf fmt "something here as well" 

Я хочу изменить эту функцию, чтобы вернуть строку. Printf.sprintf не является вариантом из-за некоторых довольно принтеров, которые я использую в исходном коде. Пожалуйста помоги.

+1

[ 'Format.sprintf'] (http://caml.inria.fr/pub/docs/manual-ocaml/libref/Format.html#VALsprintf) ? – pdexter

ответ

3

Использование Format.asprintf:

let string_of_s = Format.asprintf "%a" some_function s 

Я не рекомендую использовать Format.sprintf, поскольку она имеет ограниченный тип. Например, следующий не тип проверки:

let string_of_s_ill_typed = Format.sprintf "%a" some_function s 
+0

В соответствии с документом Format.fprintf может печатать на строку. Можно ли использовать эту функцию для возврата строки из указанной функции? Я имею в виду использование 'fprintf' для записи в строку и возвращать то же самое – user3586612

+0

Вы можете использовать специальный файл форматирования 'str_formatter', чтобы перенаправить вывод' fprintf' в буфер вместо обычных каналов. BUt имеет некоторые недостатки: вам нужно вызвать 'flush_str_formatter', чтобы получить результат строки, а' str_formatter' - глобальное состояние, поэтому подвержено ошибкам, по сравнению с 'asprintf'. – camlspotter