17

次のように、doubleに暗黙的に変換されるC#クラスがある場合:

public class Parameter
{
    private double _value;
    public Parameter(double value) { _value = value }
    public static implicit operator double(Parameter p) { return _value; }
}

F#は、私がそれをあたかもそれであるかのように使おうとするのを嫌いますfloat

let a = Parameter(4.0)
let b = Parameter(2.0)
let c = a * Math.Sin(b) <-- 'expected float, here Parameter'

これを行う方法はありますか(この質問/回答に基づいて、そうではないと思います)、そうでない場合、適切な回避策は何でしょうか?

4

3 に答える 3

31

F#は暗黙的な変換を実行しませんが、それらを実行するための明示的な演算子を定義できます。前の質問に対するkvbの回答を参照してください。

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

これは、静的に解決された型パラメーターを使用して、入力または結果のいずれかが暗黙の変換演算子を提供する必要があることを示しています。これらは、という名前op_Implicitのメソッドにコンパイルされるため、F#コンパイラはこの特別な名前の静的メソッドをチェックします。

演算子を使用すると、次のように、コードサンプルのどこに(2回)変換する!>かを明示的に指定できます。Parameterfloat

let a = Parameter(4.0) 
let b = Parameter(2.0) 
let c = !> a * Math.Sin(!> b)

F#で暗黙的な変換を許可しない主な理由は、型の推論が少し難しくなり、コンパイラーが適切なエラーメッセージを表示するのが難しくなるためだと思います。

于 2012-05-23T12:37:54.840 に答える
1

暗黙の変換はできません。必要な場所で変換を明示的にします。

明示的に行うさまざまな方法については、こちらをご覧ください:http: //natehoellein.blogspot.com/2008/02/basic-type-conversions-with-f.html

于 2012-05-23T12:29:26.867 に答える
1

FSharp.Interop.DynamicはDLRを使用するため、ほとんどの人にとってはおそらくやり過ぎですがDyn.implicitConvert、C#の暗黙的な演算子を動的に使用するための関数があります。

   [<Test>] member basic.``Test Implicit Conversion`` ()=
                    let ele = 50
                    ele |> Dyn.implicitConvert |> should equal (decimal 50)
于 2018-04-02T22:22:55.147 に答える