Ich habe gerade angefangen, mit F# in Mono herumzuspielen, und es ist folgendes Problem aufgetreten, das ich nicht ganz verstehe. Nachschlagen von Informationen über printfn
y TextWriterFormat
hat auch keine Erleuchtung gebracht, also dachte ich, ich frage hier mal nach.
In FSI führe ich die folgenden Schritte aus:
> "hello";;
val it : string = "hello"
> printfn "hello";;
hello
val it : unit = ()
Einfach eine normale Zeichenkette und deren Ausdruck. Nun gut. Jetzt wollte ich eine Variable deklarieren, die dieselbe Zeichenkette enthält, und sie ebenfalls ausdrucken:
> 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>'
Nach meiner Lektüre habe ich verstanden, dass printfn
erfordert eine konstante Zeichenfolge. Ich verstehe auch, dass ich dieses Problem mit etwas wie folgenden umgehen kann printfn "%s" v
.
Ich würde aber gerne verstehen, was es mit dem Tippen auf sich hat. Offensichtlich, "hello"
ist vom Typ string
wie auch v
ist. Warum gibt es dann ein Typenproblem? Ist printfn
etwas Besonderes? So wie ich es verstehe, führt der Compiler bereits eine Typüberprüfung der Argumente der ersten Zeichenkette durch, so dass printfn "%s" 1
scheitert dies könnte natürlich nicht mit dynamischen Strings funktionieren, aber ich nahm an, dass dies eine reine Bequemlichkeit von der Compiler-Seite für den statischen Fall ist.