2

私は F# を使い始めましたが、いくつかのコード構造に疑問を感じています。例えば:

次のコードがあります:

let mutable s = 10
s <- 1 + s
printf "%i" s

数学の面からすべてが明らかです。「s」をミュータブルとしてマークし、新しい値を「s」に割り当てました。結果は11。

コードの他の部分を試してみましょう:

let mutable s = 10
s = 1 + s
printf "%i" s

このコードは機能しました。しかし、それs = 1 + sは数学の面から見ると少し奇妙です。これを実行した結果は10でした。

私の質問は、最後のサンプルで何が起こっているのですか? エラーが発生しなかったのはなぜですか? s = 1 + s無視されるだけ?なんで?出力にエラーはありませんでした。

4

2 に答える 2

3

2番目の質問に答えるには-

エラーが発生しなかったのはなぜですか? s = 1 + s は無視されますか? なんで?出力にエラーはありませんでした。

これは、F# がスクリプト ファイルの最上位スコープとローカル スコープを区別するためです。スクリプト ファイル ( *.fsxVisual Studio または Try F# 内のファイル) を使用している場合は、一連の式 (値を返す可能性がある) を記述し、それらを 1 つずつ対話的に実行することをお勧めします。これは、1 行に書いた場合s = 1 + s、その行を評価して (行を選択して Ctrl+Enter または Alt+Enter を押す)、インタラクティブな出力で結果を確認できるため、エラーではないことを意味します。

ただし、これが関数内 (または対話的に評価することが期待されていない他のローカル スコープ) にある場合は、警告が表示されます。確認する最も簡単な方法は、次を使用してローカル スコープを作成することですdo(これは Try F# でも機能します)。

do
  let mutable s = 10
  s = 1 + s           // Warning: This expression should have type 'unit', 
                      //    but has type 'bool'. If assigning to a property 
                      //    use the syntax 'obj.Prop <- expr'.
  printf "%i" s
于 2013-04-10T13:49:01.643 に答える