2014-11-24 7 views
3

В библиотеке есть класс с более высоким типом, с одним параметром типа. Я хочу дать ему тип, который принимает два параметра, поэтому я использую выражение type, чтобы исправить другой параметр.Несоответствие типов при использовании более высокосортных типов

Но это не так, как я ожидаю.

Код сводится к этому:

object Main { 

    class Bar[T[_]] { 
    def bar[A]: Option[T[A]] = None 
    } 

    def foo[A] = { 
    type T[B] = Map[A, B] 
    new Bar[T] 
    } 

    val f: Option[Map[String, Int]] = foo[String].bar[Int] 

} 

Я получаю сообщение об ошибке при компиляции (Scala 2.11.4):

test.scala:12: error: type mismatch; 
found : Option[T[Int]] 
    (which expands to) Option[scala.collection.immutable.Map[A,Int]] 
required: Option[Map[String,Int]] 
    val f: Option[Map[String, Int]] = foo[String].bar[Int] 
               ^
one error found 

Почему ошибка типа?

ответ

5

Тип labmdas должно помочь:

class Bar[T[_]] { 
    def bar[A]: Option[T[A]] = None 
    } 

    def foo[A] = { 
    new Bar[({type M[B] = Map[A, B]})#M] 
    } 

    val f: Option[Map[String, Int]] = foo[String].bar[Int] 

Однако я не могу ответить, почему тип T не работает в этом случае.

+0

Теперь, когда вы упомянули об этом, я видел тех, кто использовал это раньше. –

Смежные вопросы