3

非常に簡単な例:

  1. let myfun x = x
    ここのインテリセンスでは、「x: 'a -> 'a」と表示されます。FSI では、「x: 'a -> 'a」と表示されます。
  2. let inline myfun x = x
    ここのインテリセンスでは、「x: 'a -> 'a」と表示されます。FSI では、"x: 'a -> 'a" <<<< なぜ^aでしょうか?
  3. let inline myfun (x: 'b) = x
    ここのインテリセンスでは、「x: 'b -> 'b」と表示されます。FSI では、「x: 'b -> 'b」と表示されます。
  4. let inline myfun (x: ^b) = x
    ここのインテリセンスでは、「x: 'b -> 'b」と表示されます。FSI では、"x: ^b -> ^b" <<<< 違います。

インテリセンスでは が表示されないため、FSI で「静的に解決された」指標として^bを探す必要がありますか?^b

inline「静的に解決」を保証しますか?

4

1 に答える 1

1

インラインは静的に解決された型を許可しますが、強制しません。それがケース 2 の理由です。ケース 1 と同じままです。ほとんどの場合、型推論は、型が本当に静的に解決されるべきかどうかを推測するのに十分スマートだと思います。を指定しないでください^

たとえば、関数本体をsqrt xケース 3 に変更すると、次のようになります。

> let inline myfun (x: 'b) = sqrt x;;
val inline myfun :  ^b ->  ^a when  ^b : (static member Sqrt :  ^b ->  ^a)

私は個人的に、最初の試みでタイプを明示的に指定しないように常に心がけています。次に、推論に満足しているかどうかを確認します。そうでない場合は、インラインで追加しようとしますが、帽子のタイプは追加しません。

インテリセンスが時々違うものを表示するのはなぜですか? それはおそらく小さなバグです。

于 2013-05-02T08:49:51.423 に答える