2009-06-24 11 views
7

私はF#(Visual Studio 2010 beta 1)で遊んでいましたが、ユーザーに2つの数字と演算子を入力して実行させる小さなコンソールスクリプトを書きました。 小さくても厄介なことを除けば、うまく動作します。私のprintfn命令は無視されることがあります。私はコードにブレークポイントを置いて、それが実際にそうであることを確認しました。F#strange printfn problem

コードスニペット:

let convert (source : string) = 
    try System.Int32.Parse(source) 
    with :? System.FormatException -> 
     printfn "'%s' is not a number!" source; 
     waitForExitKey(); 
     exit 1 

let read = 
    printfn "Please enter a number."; 
    System.Console.ReadLine 

let num1 : int = read() |> convert // the printfn in the read function is run... 
let num2 : int = read() |> convert // ... but here is ignored 

これは当然の完全なソースではないですが、私はそれが十分だろうと思います。完全な情報源が必要な場合は、私に知らせてください。

私の質問はかなり簡単です:printfnでこの問題の原因は何ですか?私は何か間違っているのですか?事前に

おかげで、 ShdNx

答えて

15

This pageは何が起こっているのかを部分的に説明がありますが、短いと甘いバージョンは、F#がするということですパラメータを取らない場合は、宣言上の任意の値を実行します。 readので

let read = 
    printfn "Please enter a number." 
    System.Console.ReadLine 

、任意のパラメータを取り、その宣言に直ちに実行され、識別子readに関数の戻り値を結合しません。

ちなみに戻り値は、タイプが(unit -> string)の関数です。 F#が自動的にパラメータのすべてを渡さないと、自動的にcurries functionsになります。 ReadLineには1つのユニットパラメータが必要ですが、渡されないため実際にはReadLine関数自体にreadをバインドします。次のように

溶液である:readので

let read() = // read takes one unit parameter 
    printfn "Please enter a number." 
    System.Console.ReadLine() // pass paramter to ReadLine method 

はつのパラメータ、その呼ばれるその再評価された各時間を要します。さらに、パラメータをReadLineに渡します。それ以外の場合は、ReadLine関数を値として返します。

+0

ありがとうございました!残念ながらレイは速かったので、私は彼の答えを受け入れました。しかし、私はあなたがこれを明確にしたことをとてもうれしく思います。再度、感謝します! – ShdNx

+0

私は同意します! +1はより明確な説明です! –

7

私は、これが混乱することができることを理解しています。あなたの例では、printfnは思ったより早く実行されます。実際にはread()を呼び出さなくても実行されます。すなわち、最後の2行をコメントアウトすると、メッセージが表示されます。これはあなたの元の例のように、識別子の機能を結合するのではなく、「再利用可能」関数を作成します

let read() = 
    printfn "Please enter a number."; 
    System.Console.ReadLine() 

は、私はあなたの意図は、このようなものだと思います。追記として

、ここではセミコロンを使用すると、あなただけ書くことができますので、オプションです:

let read() = 
    printfn "Please enter a number." 
    System.Console.ReadLine() 
+0

ありがとう、私は今それを理解していると思います! セミコロンを使用するのは、各行の後に自動的にセミコロンを追加するため、私には見えない場合は気になります。:-) – ShdNx