2009-11-06 10 views
24

C#では、次のように暗黙の演算子をクラスに追加できます。F#で暗黙のC#演算子を作成するのと同じことはありますか?

public class MyClass 
{ 
    private int data; 

    public static implicit operator MyClass(int i) 
    { 
     return new MyClass { data = i }; 
    } 

    public static implicit operator MyClass(string s) 
    { 
     int result; 

     if (int.TryParse(s, out result)) 
     { 
      return new MyClass { data = result }; 
     } 
     else 
     { 
      return new MyClass { data = 999 }; 
     } 
    } 

    public override string ToString() 
    { 
     return data.ToString(); 
    } 
} 

次に、MyClassオブジェクトに文字列またはintが必要な関数を渡すことができます。 eg

public static string Get(MyClass c) 
{ 
    return c.ToString(); 
} 

static void Main(string[] args) 
{ 
    string s1 = Get(21); 
    string s2 = Get("hello"); 
    string s3 = Get("23"); 
} 

F#でこれを行う方法はありますか?

答えて

27

他の人が指摘しているように、F#では暗黙の変換を行う方法がありません。しかし、あなたは常に明示的に物事を変換する(および既存のクラスが定義されているすべてのop_Implicitの定義を再利用するために)、それは少し簡単にするために、独自の演算子を作成することができます。

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

その後、あなたはこのようにそれを使用することができます:

type A() = class end 
type B() = static member op_Implicit(a:A) = B() 

let myfn (b : B) = "result" 

(* apply the implicit conversion to an A using our operator, then call the function *) 
myfn (!> A()) 
+0

これは、F#2.0の無効なプレフィックス演算子名のようです。演算子名の規則はどこかで定義されていますか?この制限を示す[MSDN](http://msdn.microsoft.com/en-us/library/dd233204.aspx)ページに何も表示されません。 – Daniel

+0

名前から '〜'を省略すると動作します。ルールは変わりましたか? – Daniel

+0

@ダニエル - はい、私はルールが変更されているに違いないと思います。 '〜'を省略すると、接頭辞演算子ではなく接尾辞になります。しかし、 '〜'を '!'に置き換えるとうまくいくはずです。 – kvb

3

いいえ、ありません。

8

型の安全性と型推論に関しては、暗黙的な変換はむしろ問題であるため、答えは「いいえ、実際は問題のある機能です。

関連する問題