2016-02-21 1 views
1

следующие работы:Ссылаясь на суб-типа пути в зависимости от типа

class Outter { 
    type Inner = Either[Int,String] 
    type L = Left[Int,String] 
    type R = Right[Int,String] 

    def f(x: Inner) = 1 
    } 

    val o = new Outter 
    o.f(new o.L(1)) 
    o.f(new o.R("name")) 

, но только потому, что существует явное type элемент для всех подтипов в Inner. Возможно ли построить значение из подтипа зависимого от пути типа без, необходимо указать их явно в Outter? Как:

class Outter { 
    type Inner = Either[Int,String] 
    def f(x: Inner) = 1 
    } 

    val o = new Outter 
    o.f(new o.?!?(1)) // How do I express "that particular Left[Int,String] which is the sub-type of o.Inner 
    o.f(new o.?!?("name")) // same as above here, but for Right 

Связанные Path-dependent argument type is not enforced (?)

ответ

2
type Inner = Either[Int, String] 

Это тип псевдонима. Inner не является подклассом Either[Int, String], они одинаковы. Просто синтаксический сахар. Таким образом, вы можете стил обратиться к подклассам Either[Int, String], как будто они являются подклассами Inner

Таким образом, решение может быть более простым, то вы себе представить.

val o = new Outter 
o.f(Left(1)) // How do I express "that particular Left[Int,String] which is the sub-type of o.Inner 
o.f(Right("name")) // same as above here, but for Right 
+1

«Это псевдоним типа.» Либо [Int, String] 'не является подклассом« Либо », да, я знаю. Это был не мой вопрос (кстати, «Либо [Int, String]' is * not * так же, как 'Either'. Первый - это правильный тип, более поздний - конструктор типов arity 2). –

+0

Вопрос в том, как мне создать 'Left' и' Right' ожидаемого типа (который является 'o.Inner' и * not *' Inner'). У меня нет REPL, но я думаю, что ваш код не набирает check (тип mismatch, обязательный 'o.Inner', найденный' Left') –

+0

", кстати,' Либо [Int, String] 'не является то же, что и «Либо». Это опечатка с моей стороны. Я хотел сказать: «Внутренний» не является подклассом «Либо [Int, String]' ». Я отредактировал свой ответ. –