2010-03-08 16 views
5

Po wypróbowaniu programowania konsoli otrzymałem nieoczekiwany wynik.Czy to błąd F # Buildera, czy moje nieporozumienie?

open System 

let printSomeMessage =   
    printfn "Is this the F# BUG?"  

[<EntryPoint>] 
let main args =  
    if args.Length = 2 then 
     printSomeMessage 
    else   
     printfn "Args.Length is not two." 
    0 

Funkcja printSomeMessage została uwzględniona w funkcji .cctor(). Oto wynik IL DASM.

.method private specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  24 (0x18) 
    .maxstack 4 
    IL_0000: nop 
    IL_0001: ldstr  "Is this the F# BUG\?" 
    IL_0006: newobj  instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5<class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit>::.ctor(string) 
    IL_000b: call  !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine<class [FSharp.Core]Microsoft.FSharp.Core.Unit>(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4<!!0,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit>) 
    IL_0010: dup 
    IL_0011: stsfld  class [FSharp.Core]Microsoft.FSharp.Core.Unit '<StartupCode$FSharpBugTest>'.$Program::[email protected] 
    IL_0016: pop 
    IL_0017: ret 
} // end of method $Program::.cctor 

Tak więc jego wynik wykonania wygląda następująco.

Czy brakuje mi jakiejś cechy gramatycznej lub F #? Lub BŁĄD robota F # buildera?

Odpowiedz

10

Nie jest to błąd w kodzie. Musisz dodać nawiasy po "printSomeMessage", w przeciwnym razie PrintSomeMessage jest prostą wartością, a nie funkcją.

open System 

let printSomeMessage() =   
    printfn "Is this the F# BUG?"  

[<EntryPoint>] 
let main args =  
    if args.Length = 2 then 
     printSomeMessage() 
    else   
     printfn "Args.Length is not two." 
    0 

Proste wartości są inicjowane w konstruktorze modułu, dzięki czemu kod jest wywoływany podczas inicjalizacji modułu. Jest to logiczne, gdy się nad tym zastanowisz, zwykły przypadek prostych wartości wiązałby łańcuch, liczbę całkowitą lub inną literalną wartość do identyfikatora. Z wyjątkiem tego, aby to się stało uruchomieniem. tj. przy uruchomieniu modułu obowiązują następujące warunki:

let x = 1 
let y = "my string" 
+0

Najwyraźniej mogę zrozumieć! Dziękujemy! –

+0

Nie ma problemu, cieszę się, że moja odpowiedź pomogła. – Robert

+0

Wyczyść jako dzień, dobra odpowiedź! –

Powiązane problemy