2011-03-10 6 views
0

매트릭스 클래스와 mop 메서드를 만들었습니다. (이진 연산자를 인자로 취하고 각 원소 연산을 가능하게합니다.)하지만 mop 메서드로 + 연산자를 만들 수 없습니다.어떻게 스칼라에서 행렬 + 연산자를 만들 수 있습니까?

val matA = new Matrix[Int](List(1 :: 2 :: 3 :: Nil, 4 :: 5 :: 6 :: Nil)) 
val matB = new Matrix[Int](List(7 :: 8 :: 9 :: Nil, 10 :: 11 :: 12 :: Nil)) 

val matC =matA. mop(matB) (_ + _)         //can work 
def +(that: Matrix[T]) = this.mop(that)(_ + _)      //can't work 
val matC = matA + matB 

//class definition 

type F[T] = (T, T) => T 
type M[T] = List[List[T]] 


class Matrix[T](val elms: M[T]) { 

    override def toString()= (this.elms map (_.mkString("[", ",", "]"))).mkString("\n") 

    def mop(that: Matrix[T])(op: F[T]): Matrix[T] = new Matrix[T](((this.elms zip that.elms).map(t => ((t._1 zip t._2)).map(s => op(s._1, s._2))))) 

// def +(that: Matrix[T]) = this.mop(that)(_ + _) 

} 

답변

2

문제는 T에 추가가 정의되어 있지 않을 수 있습니다. 따라서 특정 행렬 (Ints 중 하나)을 가지고있을 때 mop은 무엇을 해야할지 알고 있습니다. 그러나 일반적인 코드가 작동하지 않습니다.

class Matrix[T](val elms: M[T])(implicit nt: Numeric[T]) { 
    import nt._ 

    override def toString()= (this.elms map (_.mkString("[", ",", "]"))).mkString("\n") 

    def mop(that: Matrix[T])(op: F[T]): Matrix[T] = 
    new Matrix[T](((this.elms zip that.elms).map(t => ((t._1 zip t._2)).map(s => op(s._1, s._2))))) 

def +(that: Matrix[T]) = this.mop(that)(_ + _) 
} 
+0

내가 숫자를 사용하는 방법을 알고하지 못했지만, 지금은 당신을 게 감사 이해 : (있는 경우)

당신은 T에 대한 수치 연산을 제공하기 위해 암시 Numeric를 사용할 수 있습니다. – mnru

관련 문제