Я не думаю, что тот факт, что он отсутствует в таблице допустимых типов, вызывает проблему (модификатор «% c» определенно поддерживается, поскольку тип printfn "%c"
равен char -> unit
, как и следовало ожидать). Значит, это похоже на ошибку.
Простой обходной путь заключается в использовании «% O» модификатор, который принимает любой тип (также включая char
значений) и форматирует его с использованием метода ToString
(доступна для всех типов .NET):
> printfn "%10O" 'a';;
a
val it : unit
BTW: Я посмотрел на 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