5

F#を学んでいます。Microsoftの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# の定義に使用する適切な言葉ですか?

ありがとう。

4

1 に答える 1

15

F# で識別子の値をバインドするための一般的な形式は次のとおりです。

let pattern = expression

この場合、パターンは "line1, line2" で、これはタプルパターンです。値の 2 タプルにバインドし、名前 "line1" と "line2" をこれら 2 つの値に割り当てます。

は次の4 行です。その式の中にはローカル変数があります。たまたま「line1」と「line2」という名前も付けられていますが、「x」や「y」などの名前に簡単に変更できます。これらの識別子のスコープは、このインデントされた式に対してローカルです。(同じ名前が外側のスコープの名前として使用されているという事実は、コンパイラに関する限り効果がありません。)

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

F# は機能的であり、ある意味では「すべてが式である」および「ステートメントはありません」(順次評価される式のシーケンスのみ) ですが、「ステートメント」という用語を (乱用) 使用して説明することは問題ありません。非常に正確にしようとしている場合を除き、内側の「let」行。

于 2009-05-13T16:41:58.933 に答える