2016-10-16 4 views
2

я создал этот случай классы и функции в Скале:Scala: тематические классы и сопоставления с образцом

abstract class Building[T] 
case class University[T](a: Building[T], b: Building[T], c: T) extends Building 

def u[A,B](a: Building[A]): Building[B] = a match { 
    case n: University[A] => University[B](n.a, n.b, n.c); 
} 

Однако это говорит, что это при компиляции:

[ошибка] test.scala: 357: тип несоответствие; [Ошибка] найдено: test.abc.def.University [B] [ошибка] требуется: test.abc.def.Building [B]

Что я делаю неправильно?

ответ

1

University должна распространяться не только Building[T]Building

case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T] 

Вот полный код

abstract class Building[T] 
case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T] 

u В функции типа вывода является Building[B]. Вы возвращаетесь University[B] Но University[B] занимает значение Building[B] b, которое также является Building[B] и c, которое равно B.

n.a возвращает Building[A] не Building[B] так University[B] занимает два Building[B] и один B. Вы не можете пройти n.a, n.b и n.c, чтобы создать university[B].

Чтобы сделать код компиляции я изменил тип выхода и возвращения University[B]

def u[A,B](a: Building[A]): Building[A] = a match { 
    case n: University[A] => University[A](n.a, n.b, n.c); 
} 

Правильный код

abstract class Building[T] 

case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T] 

def convert[A, B](a: A): B = ??? 

def bConvert[A, B](building: Building[A]): Building[B] = ??? 

def u[A,B](a: Building[A]): Building[B] = a match { 
    case n: University[A] => University[B](bConvert(n.a), bConvert(n.b), convert(n.c)); 
}