2011-01-17 4 views
3

목록 목록이 있고 데이터 (-, +, *, /)에 대한 수학 연산을 수행하려는 위치에서 작동하는 간단한 기능을 얻으려고합니다. 이 메소드가 다음 유형 (Int, Float, Double) 중 하나를 사용하기를 원합니다.스칼라 매개 변수화 된 메서드 및 산술 연산

표시 다음은
def doSomething[T](data: List[T]){ 
data reduceLeft(_/_) 
} 

: 여기

내가 시도한 것입니다/형식 매개 변수의 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

미안 데이터는 List [List [T]]입니다. –

+0

이 작업을 수행하는 한 가지 방법은 매개 변수가있는 클래스 내에 포함시키는 것이 었습니다. 그러나, 나는 아직도 위가 작동하지 않는지 궁금합니다. 특히이 메서드를 Function 개체로 사용하려는 경우. –

답변

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(_, _))} 

, - 그리고 *은 (plus, minus, times 각각) 쉽게 :

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에서 튜플 값을 사용하는 데 문제가있는 것처럼 보입니다. 문제를 보여주기 위해 예제를 업데이트했습니다. –

관련 문제