2017-06-04 7 views
0

代数型の階層で型クラスを設定する際に問題があります。スカラ型のクラス暗黙のあいまいさ

私は、以下の特徴を持っている:

trait Field[F]{...} 

trait VectorSpace3[V,F] extends Field[F]{...} 

は、私は実装を提供したい知っている:

trait DoubleIsField extends Field[Double]{ 
    ... 
} 

trait DoubleTurple3IsVectorSpace3 extends VectorSpace3[(Double,Double,Double), Double] with Field[Double]{ 
    ... 
} 
trait MyOtherClassIsVectorSpace3 extends VectorSpace3[MyOtherClass, Double] with Field[Double]{ 
    ... 
} 

//now the implicits 
implicit object DoubleIsField extends DoubleIsField 
implicit object DoubleTurple3IsVectorSpace3 extends DoubleTurple3IsVectorSpace3 with DoubleIsField 
implicit object MyOtherClassIsVectorSpace3 extends MyOtherClassIsVectorSpace3 with DoubleIsField 

最後の二つの暗黙のあいまいさにつながる:DoubleIsFieldは3つの暗黙の値の一部であり、コードはありませんコンパイルしないでください。スカラーでこの問題に対処するには?

EDIT:

エラー:

ambiguous implicit values: 
[error] both object DoubleIsField in object TypeClasses of type 
Russoul.lib.common.TypeClasses.DoubleIsField.type 
[error] and object DoubleTurple3IsVectorSpace3 in object TypeClasses of type 
Russoul.lib.common.TypeClasses.DoubleTurple3IsVectorSpace3.type 
[error] match expected type Russoul.lib.common.TypeClasses.Field[...Double] 

EDIT2:

def func()(implicit env: Field[Double]): Unit ={ 

} 

func() 

のフルテストプログラム:

object Test extends App { 

trait Field[F]{ 

} 

trait VectorSpace3[V,F] extends Field[F]{ 

} 
trait DoubleIsField extends Field[Double]{ 

} 

trait DoubleTurple3IsVectorSpace3 extends VectorSpace3[(Double,Double,Double), Double] with Field[Double]{ 

} 


//now the implicits 
implicit object DoubleIsField extends DoubleIsField 
implicit object DoubleTurple3IsVectorSpace3 extends DoubleTurple3IsVectorSpace3 with DoubleIsField 


def func()(implicit env: Field[Double]): Unit ={ 

} 

func() 

} 
+1

'DoubleIsField'(' object'ではなく最初の宣言)は 'trait'または' class'として宣言されていません。コンパイラエラーメッセージとは何ですか? –

+0

@MikeAllen申し訳ありませんが、それは形質です。それは実際のコードではありません。私はちょうど問題を示す簡略版を書いた – Russoul

+0

@MikeAllenエラーの編集を参照してください – Russoul

答えて

1

(あなたの最近のコメントに照らして更新... )

問題は、次の関数の定義である:(

def func()(implicit env: Field[Double]): Unit = { 
    // ... 
} 

あなたの問題は、あなたが同じスコープ内でこのタイプの複数のimplicit値を持っており、そのコンパイラが提供するかを知ることができないということです彼らはすべてField[Double]タイプのものとして表現できる暗黙の値です。

implicit引数の値の全体は、コンパイラによって識別できる単一の値があることです。それを識別できない場合は、あなたの心を読んで正しいものを選ぶことはできません。また、ランダムに選択することもできません。

  • 見送るがimplicit引数の値を使用して、明示的にあなたの関数に値を渡す:次のように用意して

    オプションがあります。

  • implicit引数を持つ関数の定義を、一意のimplicit値を持つ型に変更します。
  • implicit objectの定義を1つ使用してください。
+0

もちろん、私は別の範囲にそれらのimplicitsを移動しなければならなかった...ありがとう。私は関数を持っているとします: 私は関数を持っているとします: – Russoul

+0

'def func()(暗黙の構成:フィールド[...] ExtraOperation [...]){...}' そして私は両方に対して別々のimplicitsを持っていますフィールドとExtraOperation。 ExtraOperationでFieldを保持する余分なオブジェクトを作成するよりも、mixinを提供する良い方法はありますか? – Russoul

+0

@Russoulその宣言が与えられた場合、 'Field [X]'型の '暗黙的な'型は、 'ExtraOperation [Y]'型の 'Field [X]型の'暗黙の '引数にはマッチしません後者のタイプで混合する。私はあなたが '暗黙の'議論を過度に使うかもしれないと思います。あなたは何をしようとしているのですか? –

関連する問題