No creo que el hecho de que falta en la tabla de tipos válidos está causando el problema (definitivamente el modificador "% c" es compatible, porque el tipo de printfn "%c"
es char -> unit
como es de esperar). Entonces, parece un error para mí.
Una solución fácil es utilizar el modificador "O%", que tiene cualquier tipo (incluyendo también char
valores) y formatos que utilizando ToString
método (disponible para todos los tipos de .NET):
> printfn "%10O" 'a';;
a
val it : unit
por cierto: miré el código fuente de la biblioteca # F (desde el lanzamiento de CTP) y aquí es el bit correspondiente de printf.fs
(línea 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
La línea (1) formatea un carácter e ignora el parámetro width
(que es el ancho que especificó). Entonces, a menos que esto sea (por alguna razón, por ejemplo, ¿rendimiento?) Comportamiento intencionado, realmente parece que parece un error.
Supongo que la siguiente implementación solucionaría el problema (Brian ;-)! ¿Estás ahí?):
| 'c', nobj::args ->
formatString outputChar info width
(string ((unbox nobj):char)) false; i+1,args