Я только начал заниматься 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
is. Почему возникает проблема типа? Является ли printfn
чем-то особенным? Насколько я понимаю, компилятор уже выполняет проверку типов в аргументах первой строки, так что printfn "%s" 1
терпит неудачу.. это может, конечно, не работать с динамическими строками, но я предположил, что это просто удобство из компилятора - для статического случая.