2009-05-13 5 views
2

私はF#を学んでいます。私はマイクロソフトからF# samplesを見て始めました。F#の意味はカンマで文を出します

私はこの文に出会っ:

let line1,line2 = 
    use sr = System.IO.File.OpenText @"test.txt" 
    let line1 = sr.ReadLine() 
    let line2 = sr.ReadLine() 
    (line1,line2) 

誰も私にこの文を説明できますか?

どのようなタイプは、ここで定義されていますか?機能?タプル?

なぜline1やるとline2line1,line2let line1 = ... let line2 =)の定義の範囲内に再定義する必要がありますか? 、最終ラインで(line1, line2)だとどのようにこれは、元の定義の型に結びつけるのか?何

これは関数の戻り値ですか?

「ステートメント」はF#の定義に使用する正しい単語ですか?

ありがとうございました。

+0

奇妙な質問。私はF#についてはまだ分かりませんが、タイプが定義されていないことは明らかです - line1とline1はタプルを生成する式で計算された値を与えられます。 line1とline2が異なるスコープにあるため、line1とline2の "再定義"について尋ねると奇妙です。 'x = foo();'と同じですが、fooはx ...という名前のローカル変数を持ちますが、全く異なる変数/スロット/オブジェクト/インスタンス/ whathaveです。 –

答えて

11

F#で識別子の値を結合するための一般的な形式は、この場合

let pattern = expression 

ある、パターンタプルパターンである「LINE1、LINE2」、である、それはに結合することが期待します2タプルの値を指定し、これらの2つの値に「line1」と「line2」という名前を割り当てます。

発現は、次の4行です。その式の中にはローカル変数があります。彼らはまた、 "line1"と "line2"と命名されることもありますが、これらの識別子の範囲はこのインデントされた式のローカルなので、簡単に "x"や "y"などに改名することができます。 (同じ名前を外側のスコープ内の名前として使用されているという事実は、限りコンパイラが懸念しているように効果がありません。)

最終行発現は、発現の「戻り値」である場合。この場合、値 "line1"と "line2"の2タプルを返します(説明を明瞭にするために名前を変更した場合は "x"と "y")。ちなみに、これらの2つの値はそれぞれ "string"型であるため、戻り値の型は "string * string"であり、各値が文字列である2タプルです。つまり、最初の行の元の "line1"と "line2"の名前はそれぞれ "string"型であると推測されます。

F#は機能的なので、「すべてが式です」と「ステートメントはありません」(逐次評価される式のシーケンスのみです)ですが、あなたが非常に正確にしようとしているのでなければ、内側の "let"行を記述するための "文"

+0

すばらしい説明!しかし、このパターンを呼び出しコードでどのように使用しますか? [code] let getStringTuple = ... [/ code] など、他の名前に簡単に名前を付けることはできますか? – MEMark

+0

はい(試してみてください) – Brian

関連する問題