2012-08-14 2 views
7

This great daily Scala article은 일치시 형식 지우기를 극복하는 방법을 설명합니다. 매개 변수화 된 형식의 IndexesSeq 변환 기술을 적용하려고하지만 일치하는 실패하고 있습니다. 왜 그런가요? 어떻게 고칠 수 있습니까? 내가 데프의 행의 주석을 해제하면매니페스트와 일치하는 스칼라 패턴

object Example extends App{ 
    class TableColumn[T](
     val values: IndexedSeq[T], 
     val name: Option[String] = None 
    )(implicit val m: Manifest[T]) 

    class Def[C](implicit desired : Manifest[C]) { 
     def unapply[X](c : X)(implicit m : Manifest[X]) : Option[C] = { 
      //println("m.toString+", "+desired.toString) 
      def sameArgs = desired.typeArguments.zip(m.typeArguments).forall { 
       case (desired,actual) => desired >:> actual 
      } 
      if (desired >:> m && sameArgs) Some(c.asInstanceOf[C]) 
      else None 
     } 
    } 

    val IntTableColumn = new Def[TableColumn[Int]] 
    val DoubleTableColumn = new Def[TableColumn[Double]] 

    class Analysis(data: IndexedSeq[TableColumn[_]]){ 
     val transformedData = data.map{_ match{ 
      case IntTableColumn(tc) => println("Column of Int! "+ tc) 
      case DoubleTableColumn(tc) => println("Column of Double! "+ tc) 
      case _ => println("no match") 
     }} 
    } 

    new Analysis(IndexedSeq(
      new TableColumn(IndexedSeq(1,2,3)), 
      new TableColumn(IndexedSeq(1.0,2.0,3.0)) 
    )) 
} 

는 나는 그런 분석 생성자에서 _가 문제가 있음을 시사

prototype.Example$TableColumn[_ <: Any], prototype.Example$TableColumn[Int] 

같은 라인을 볼 수 있지만 내가 모르는 다른 무엇에 넣어 그곳에.

+2

문서에서이 구문을 읽었습니까? "매니페스트의 typeArguments 사용에주의해야합니다. 이것은 각 typeArgument의 매니 페스트 목록을 반환합니다. 매니페스트 비교가 심하지 않기 때문에 단순히 == m을 비교할 수 없습니다.이 코드의 약점은 1 단계 깊이의 제네릭 만 처리한다는 것입니다. " 둘러싼 토론은 정확하게 수정하는 방법을 알려주지는 않지만 작동하지 않는 이유를 알려야합니다. –

+0

@ 렉스 : 기사의 좀 더 미세한 점에서 길을 잃었지만 이제는 문제를 지적하고 다른 방식으로 문제를 해결할 수 있는지 생각해 보겠습니다. 감사합니다. – Pengin

+1

실제로 두 가지 문제가 있습니다. 하나는 중첩이고 다른 하나는 유형을 확장해야하는 하나의 목록에 여러 유형이 있다는 것입니다. 최종 솔루션에서 isAssignableFrom을 원한다고 생각하지만 불행히도 지금 당장 솔루션을 작성할 시간이 없습니다. –

답변

1

감사합니다. Rex Kerr의 의견에 감사 드리며 저는 생각합니다. 아마도 더 우아하게/일반적으로 수행 할 수 있습니다. 그러나 지금 당장 작업을 완료 한 것으로 보입니다.

object Example extends App{ 
    class TableColumn[T](
      val values: IndexedSeq[T], 
      val name: Option[String] = None 
    )(implicit val m: Manifest[T]) 

    class TableColumnMatcher[T](implicit desired: Manifest[T]){ 
     def unapply(tc: TableColumn[_]): Option[TableColumn[T]] = { 
      if(tc.m == desired) Some(tc.asInstanceOf[TableColumn[T]]) 
      else None 
     } 
    } 
    object TableColumnMatcher{ 
     lazy val IntTC = new TableColumnMatcher[Int] 
     lazy val DoubleTC = new TableColumnMatcher[Double] 
    } 


    class Analysis(data: IndexedSeq[TableColumn[_]]){ 
     import TableColumnMatcher._ 
     val transformedData = data.map{_ match{ 
      case IntTC(tc) => println("Column of Ints!"); 
      case DoubleTC(tc) => println("Column of Doubles!") 
      case _ => println("no match") 
     }} 
    } 

    new Analysis(IndexedSeq(
      new TableColumn(IndexedSeq(1,2,3)), 
      new TableColumn(IndexedSeq(1.0,2.0,3.0)) 
    )) 
}