2010-05-23 3 views

ответ

6

Я не думаю, что тот факт, что он отсутствует в таблице допустимых типов, вызывает проблему (модификатор «% 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 
3

% с не перечисленных в table of valid types for F# printf. Возможно, это и есть причина вашей проблемы.

Довольно странно, согласно таблице нет типа для печати одиночных символов вообще.

Смежные вопросы