Я не думаю, что причиной является тот факт, что он отсутствует в таблице допустимых типов (модификатор "% 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
(это указанная вами ширина). Так что, если это (по какой-то причине, например, производительность?) Предполагаемое поведение, оно действительно выглядит как ошибка!
Я полагаю, что следующая реализация решит проблему ( Brian ;-)! Вы там? ):
| 'c', nobj::args ->
formatString outputChar info width
(string ((unbox nobj):char)) false; i+1,args