2016-12-29 6 views
0

長い間、暗黙的なクラスを避けようとしましたが、最近はそのクラスに落ちました。現時点では、私の関数aFunc2の戻り型が、aFunc1のパラメータと同じように、その暗黙の形式に変換できない理由を理解できません。暗黙のクラスを関数の結果の型として使用する方法

object SO extends App { 
    implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) { 
    def foo(): String = "Bar" 
    } 

    // Works 
    println((12, 23.1).foo()) 

    // Works 
    def aFunc1[K, V](e: Experiment[K, V]): String = e.toString 
    println(aFunc1((12, 23.1))) 

    // does not - why ? 
    def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1) 

} 

EDIT 1:実際には、これはタイプで行うので、私は例を少し拡張できなければならない:

object SO extends App { 
    implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) { 
    def foo(): (K, V) = (tpl._1, tpl._2) 
    } 

    // Works 
    println((12, 23.1).foo()) 

    // Works 
    def aFunc1[K, V](e: Experiment[K, V]): String = e.toString 
    println(aFunc1((12, 23.1))) 

    // still does not but K and V should actually match - i guess 
    def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo() 

} 

がエラー:

Error:(19, 66) type mismatch; 
found : (K, V) 
required: scratch.SO.Experiment[K,V] 
    def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo() 

答えて

1

それは少しあります実際のエラーがなければ問題を推測するのは難しいです。エラーメッセージで質問を更新する必要があります。

コードを見ると、問題は「暗黙のクラス」ではなく、タイプが一致していないことを推測しています。

ライン:

def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1) 

はタイプExperiment[K,V]の戻り値はKVあなたのメソッドの呼び出し元によって指定されている両方だった期待しています。 返すのはタイプ(Int, Double)のタプルなので、コンパイラは文句を言うでしょう。

あなたがExperiment[Int, Double]を返すようにしたいなら、あなたはに関数の定義を変更する必要があります。

def aFunc2[K, V](e: Experiment[K, V]): Experiment[Int, Double] = (12, 23.1) 

UPDATE: あなたはaFunc2の定義にKVのための暗黙の制約を追加してみてくださいことはできますか? それは次のようになります。

def aFunc2[K: Ordering, V: Fractional](e: Experiment[K, V]): Experiment[K, V] = e.foo() 

をあなたがExperiment[K, V]にタプル(K,V)を変換するためにあなたがVのための2つの暗黙の範囲内の値(Kための順序、および小数を持っている必要があることを忘れてはいけません)。

+0

はい、それはタイプに関連しているので、私は少し質問を延長しました。 – KIC

+0

@KICアップデートを追加しましたか?私は現時点でスカラ流通の準備が整っていないので、私はここで盲目に飛んでいることを認めなければならない。 –

+0

素晴らしい作品 - thx! – KIC

関連する問題