0

これは、ここで起こっていることの内部と関係があると確信しています。うまくいけば、誰かが明確にすることができます。

C# に適したライブラリにアクセスしています。

配列として機能する特定のオブジェクトが 1 つあります (これは lib のユーザー定義型です)。C# 内で呼び出すことができます。

myObject[0] = 1

そして、私はそうすることに間違いはありません。

F# で次のことを実行しようとすると、エラーが発生します -The expression was expected to have type float32 but instead has type int.

myObject.[0] <- 1

これは機能します。

myObject.[0] <- float32 1

問題は、C# ではこの型変換が自動的に行われ、F# では行われないのはなぜですか? このようなものをきれいにするために F# でできることはありますか?

4

1 に答える 1

4

F# の型チェック メカニズムは、多くの点で C# の型チェックよりも厳密です。これの 1 つの側面は、F# が舞台裏で暗黙的な変換を行わないため、適切な数値リテラル ( など1.0f) または明示的な変換関数 ( などfloat32) を使用する必要があることです。

なぜ言語はこのように設計されているのですか? 理由の 1 つは、型の推論がより単純で予測しやすくなることです。例えば:

let data = [| 0; 1; 2 |]

let writeData n = 
  data.[0] <- n

ここで、F# コンパイラdataは が型であることを認識しint[]ます (整数を含む配列に初期化されるため)。また、配列には整数が含まれているため、それも整数でなければならないため、それwriteDataが関数であることも認識しています。int -> unitn

コンパイラが暗黙的な変換を行った場合、多くの不確実性が生じます。

  • dataたとえば、float[]またはfloat32[]整数を他の数値型に暗黙的に変換できるためです
  • dwriteDataint( など)int16に変換可能な任意の数値型を取ることができます。sbyte

これにより、型情報がより複雑になり、おそらくより頻繁に型を明示的に指定する必要があります。このため、F# はトレードオフを選択します。変換を明示的に記述する必要がありますが、型注釈を頻繁に使用する必要はありません。

于 2013-03-01T13:50:52.620 に答える