2017-05-14 1 views
1

Symbolクラスに暗黙的に2つのレベルのimplicits(hereのように)を追加しようとしています。 次のコードを考えてみましょう:暗黙的に変換するときに暗黙のany2stringaddシンボル

case class A(s: Symbol) 
case class B(s: A) { 
    def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s)) 
} 
implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s)) 
implicit def symbolToA(s: Symbol) = A(s) 

val x = 'a + 'b 

このプログラムはコンパイルされません:

Error: value + is not a member of Symbol

問題ではなく、スニップで定義された暗黙を選んで、Scalaはany2stringadd機能で'aを変換しているようです。実際には、以下の二つの実験では、コードのコンパイルを行うように見える:

  • 私が代わりに+(のような例えばadd
  • の異なる関数名を使用することができ、私は明示的に輸入のany2stringaddをシャドウすることができますimport Predef.{any2stringadd => _ , _}

どちらの解決法も嫌いです。私の質問は、代わりに私のプログラムを言い換えて、スカラが自分の含意を選択するように説得することですか?

注:私はscala 2.12.1を使用しています。興味深いことに、IntelliJはこのスニペットについて不平を言っていません。

答えて

1

any2stringaddという名前の別のものを有効範囲に含めることができます。

object myDsl { 
    object any2stringadd 

    case class A(s: Symbol) 
    case class B(s: A) { 
    def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s)) 
    } 
    implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s)) 
    implicit def symbolToA(s: Symbol) = A(s) 
} 

import myDsl._ 
val x = 'a + 'b 
関連する問題