2012-02-25 13 views
23

Im desconcertadoF # printf cadena

let test = "aString" 

let callMe = 
    printfn test 

Por qué no está funcionando? Lanza por debajo de error en tiempo de compilación:

El tipo 'cadena' no es compatible con el tipo 'Printf.TextWriterFormat < 'a>'

Esto funciona bien:

printfn "aString" 

Respuesta

40

Esto se debe a que el parámetro format no es en realidad un string. Es TextWriterFormat<'T> y el compilador F # convierte el formato de cadena en ese tipo. Pero no funciona en las variables string, porque el compilador no puede convertir el string en TextWriterFormat<'T> en tiempo de ejecución.

Si desea imprimir el contenido de la variable, ni siquiera debe intentar utilizar printfn de esta manera, ya que la variable podría contener especificaciones de formato.

También se puede usar el formato %s:

printfn "%s" test 

O utilice el .Net Console.WriteLine():

Console.WriteLine test 

No se olvide de añadir open System en la parte superior del archivo si desea usa la clase Console.

+0

Yo añadiría que el uso de 'Console.WriteLine' en Fa # código no es idiomático, y la versión' printf' es mucho más común . –

+1

Ah ok tiene sentido si el compilador lo convierte, supongo. Finalizado con printfn "% s" prueba – CodeMonkey

+5

También puede hacer 'stdout.WriteLine test' donde supongo que la única ventaja es que es un char más corto y no necesita abrir' System' –

4

En línea con lo svick Dicho esto, también se podría tratar esto:

let test = "aString" 
let callMe = printfn (Printf.TextWriterFormat<_> test) 
callMe 
+0

No; restricción de valor –

Cuestiones relacionadas