Я не думаю, что тот факт, что он отсутствует в таблице допустимых типов, вызывает проблему (модификатор "%c" определенно поддерживается, потому что тип printfn "%c"
равен char -> unit
, как и следовало ожидать). Так что мне это кажется багом.
Простой обходной путь — использовать модификатор «%O», который принимает любой тип (включая значения char
) и форматирует его с помощью метода ToString
(доступен для всех типов .NET):
> printfn "%10O" 'a';;
a
val it : unit
Кстати: я просмотрел исходный код библиотеки F # (из выпуска CTP), и вот соответствующий бит из printf.fs
(строка 478):
| 's',nobj::args ->
formatString outputChar info width (unbox nobj) false; i+1,args
| 'c',nobj::args ->
outputChar (unbox nobj); i+1,args // (1)
| 'b',nobj::args ->
formatString outputChar info width
(if (unbox nobj) then "true" else "false") false; i+1,args
| 'O',xobj::args ->
formatString outputChar info width
(match xobj with null -> "<null>" | _ -> xobj.ToString()) false; i+1,args
Строка (1) форматирует символ и игнорирует параметр width
(это ширина, которую вы указали). Итак, если это не является (по какой-то причине, например, производительности?) предполагаемым поведением, это действительно похоже на ошибку!
Я полагаю, что следующая реализация решит проблему (Брайан ;-)! Вы здесь?):
| 'c', nobj::args ->
formatString outputChar info width
(string ((unbox nobj):char)) false; i+1,args
person
Tomas Petricek
schedule
23.05.2010