Тип printfn в F #, статическая или динамическая строка
Я только начал играть с F # в Mono, и возникла следующая проблема, которую я не совсем понимаю. Поиск информации наprintfn
а такжеTextWriterFormat
просветления тоже не принес, поэтому я подумал, что собираюсь спросить здесь.
В FSI я запускаю следующее:
> "hello";;
val it : string = "hello"
> printfn "hello";;
hello
val it : unit = ()
Просто нормальная строка и печать ее. Хорошо. Теперь я хотел объявить переменную, содержащую эту же строку, и вывести ее тоже:
> 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>'
Из моего прочтения я понял, чтоprintfn
требует постоянной строки. Я также понимаю, что я могу обойти эту проблему с чем-то вродеprintfn "%s" v
.
Тем не менее, я хотел бы понять, что происходит с набором текста здесь. Очевидно, что"hello"
имеет типstring
так же какv
является. Почему тогда проблема с типом? Являетсяprintfn
что-то особенное? Насколько я понимаю, компилятор уже выполняет проверку типов аргументов первой строки, так чтоprintfn "%s" 1
терпит неудачу .. это, конечно, может не работать с динамическими строками, но я предположил, что это будет просто удобством со стороны компилятора для статического случая.