Właśnie zacząłem bawić się z F # w Mono i pojawił się następujący problem, którego nie mogę całkiem zrozumieć. Wyszukiwanie informacji na temat printfn
i TextWriterFormat
również nie przyniosło oświecenia, więc pomyślałem, że zapytam tutaj.Typ printfn w F #, static vs dynamiczny ciąg
W FSI uruchomić następujące:
> "hello";;
val it : string = "hello"
> printfn "hello";;
hello
val it : unit =()
prostu normalny ciąg i drukuje go. W porządku. Teraz chciałem zadeklarować zmienną zawierają ten sam ciąg znaków i wydrukować, a także:
> 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>'
zrozumiałem z lektury, że printfn
wymaga stałej ciąg. Rozumiem również, że mogę obejść ten problem z czymś takim jak printfn "%s" v
.
Chciałbym jednak zrozumieć, co się dzieje z pisaniem tutaj. Oczywiście, "hello"
jest typu string
, jak również v
. Dlaczego istnieje wtedy problem z typem? Czy printfn
jest czymś wyjątkowym? Jak rozumiem, kompilator wykonuje już sprawdzanie typów na argumentach pierwszego ciągu, tak, że printfn "%s" 1
zawiedzie ... to oczywiście nie działałoby z dynamicznymi łańcuchami, ale założyłem, że jest to po prostu wygoda od kompilatora dla przypadek statyczny.