2011-01-17 7 views
3

私はList of Listsを持つ場所で動作する簡単な機能を得ようとしており、データ( - 、+、*、/)に対していくつかの数学演算を行いたいと思います。私はメソッドが次の型(Int、Float、Double)のいずれかを取るようにしたい。Scalaパラメータ化されたメソッドと算術演算

が表示され、次のされ
def doSomething[T](data: List[T]){ 
data reduceLeft(_/_) 
} 

:ここ

は、私が試したものです/ typeパラメータTのメンバー値ではありません、私はこれが(AnyValのタイプのために働くことを得るにはどうすればよい

Double、Int、Float)?

def dot[T](l: List[List[T]])(implicit num: Numeric[T]) = 
{ 

    for (row <- data) 
     yield for(col <- l) 
      yield row zip col map {a => num.times(a._1 , a._2)} reduceLeft (_+_) 

とエラーが出る::私は、次のコードでの提案を実装しようとした

更新型の不一致が。見つかった:a._1.type(基礎タイプT)T

これを回避する方法はありますか?部門については

+0

あなたの最初の 'for'で' data'は何ですか? – fehu

+0

申し訳ありませんデータはリスト[リスト[T]]です。 –

+0

私はこれを行う方法のひとつがパラメータ化されたクラスに含まれていることを理解しました。しかし、私はまだ上記がうまくいかないのだろうかと疑問に思っています。特に、このメソッドを関数オブジェクトとして使用したい場合は、 –

答えて

9

:+については

def foo[T](l: List[T])(implicit num: Numeric[T]) = num match{ 
    case i: Integral[_] => l reduceLeft (i.quot(_, _)) 
    case fr: Fractional[_] => l reduceLeft (fr.div(_, _))} 

、 - と*それは(それぞれplusminustimes)簡単です:

def foo[T](l: List[T])(implicit num: Numeric[T]) = l reduceLeft (num.plus(_, _)) 
+2

ここでは、 (暗黙の)型クラスパターンと呼ばれる。例えば、 http://java.dzone.com/articles/scala-implicits-type-classes – Landei

+0

驚くばかり!助けてくれてありがとう。 –

+0

これで、Numericでタプル値を使用することが問題に見えます。問題を示すために私の例を更新しました。 –