Tipo de printfn em F #, sequência estática vs dinâmica
Comecei a brincar com o F # em Mono e surgiu o seguinte problema que não consigo entender direito. Procurando informações emprintfn
eTextWriterFormat
também não trouxe iluminação, então pensei em perguntar aqui.
No FSI, eu executo o seguinte:
> "hello";;
val it : string = "hello"
> printfn "hello";;
hello
val it : unit = ()
Apenas uma sequência normal e imprimi-la. Bem. Agora eu queria declarar uma variável para conter a mesma string e imprimi-la também:
> let v = "hello" in printfn v ;;
let v = "hello" in printfn v ;;
---------------------------^
\...\stdin(22,28): error FS0001: The type 'string' is not compatible with the type 'Printf.TextWriterFormat<'a>'
Eu entendi pela minha leitura queprintfn
requer uma cadeia constante. Eu também entendo que posso resolver esse problema com algo comoprintfn "%s" v
.
No entanto, eu gostaria de entender o que está acontecendo com a digitação aqui. Claramente,"hello"
é do tipostring
assim comov
é. Por que existe um problema de tipo então? Éprintfn
algo especial? Pelo que entendi, o compilador já realiza verificação de tipo nos argumentos da primeira string, de modo queprintfn "%s" 1
falha .. é claro que isso poderia não funcionar com seqüências dinâmicas, mas presumi que fosse uma mera conveniência do lado do compilador para o caso estático.