2011-01-07 7 views
3

私は簡単な質問があります。なぜこれは機能しませんか?Fを使用するタイプメンバーのタプル

type Test1() = 
    member o.toTuple = 1.,2.,3. 

type Test2() = 
    member o.test (x: float, y: float, z: float) = printfn "test" 
    member o.test (x: Test1) = o.test x.toTuple 

エラーは次のとおりです。

タイプの制約の不一致。 float型*フロート*フロートタイプTest1をタイプ 'フロート*フロート*フロート' と互換性のない型 'Test1を'

タイプ「フロート*フロートと互換性がありません* float 'は' Test1 'タイプと互換性がありません

答えて

5

オーバーロードの場合、最初のメンバーテストは複数引数メソッドと見なされるため、これは機能しません。 あなたがtupled 1が必要な場合は、余分な括弧を追加する必要があります。

type Test2() = 
    member o.test ((x: float, y: float, z: float)) = printfn "test" 
    member o.test (x: Test1) = o.test x.toTuple 

はドン・サイムhereの説明を参照してください。あなたは余分な括弧を追加したくない場合、あなたはまだタプルを分解し、複数の引数呼び出しを使用することができることを

注:説明のため

type Test2() = 
    member o.test (x: float, y: float, z: float) = printfn "test" 
    member o.test (x: Test1) = let a,b,c = x.toTuple in o.test(a,b,c) 
+0

感謝 –

4

Type2の最初のメソッドの名前をtest以外に変更してください。 2番目の方法は、最初にシャドーイングし、コンパイラを混乱させることです。

type Test1() = 
    member o.toTuple = 1.,2.,3. 

type Test2() = 
    member o.print (x: float, y: float, z: float) = printfn "test" 
    member o.test (x: Test1) = o.print x.toTuple 
関連する問題