Это ошибка F # Builder или мое недоразумение? - PullRequest
5 голосов
/ 08 марта 2010

Когда я попробовал консольное программирование, я получил неожиданный результат.

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

Функция printSomeMessage была включена в функцию .cctor (). Вот результат 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::printSomeMessage@3
  IL_0016:  pop
  IL_0017:  ret
} // end of method $Program::.cctor

Итак, результат его выполнения такой:

Is this the F# BUG?
Args.Length is not two.

Мне не хватает некоторой грамматики или характеристики F #? Или F # строительный ЖУК?

1 Ответ

10 голосов
/ 08 марта 2010

Нет, это ошибка в вашем коде. Вам нужно добавить скобки после «printSomeMessage», иначе printSomeMessage - это простое значение, а не функция.

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

Простые значения инициализируются в конструкторе модуля, поэтому вы видите, что ваш код вызывается при инициализации модуля. Это логично, если подумать, обычный случай простых значений - это привязка строки, целого или другого литерального значения к идентификатору. Вы ожидаете, что это произойдет при запуске. при запуске модуля будет связано следующее:

let x = 1
let y = "my string"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...