Тип Singleton как член типа

Я пытаюсь определить член типа как одноэлементный тип. Вот моя попытка:

      import shapeless.syntax.singleton._

trait Test{
    type Blocked <: Boolean
}

def f(t: Test{ type Blocked = false.narrow }) = ??? // does not compile

def f(t: Test{ type Blocked = false }) = ??? // argument is parsed as t: Test{ type Blocked = Boolean }

Есть ли способ установить член типа в одноэлементный тип ( Boolean(false) в моем случае)?

1 ответ

Решение

def f(t: Test{ type Blocked = false }) = ??? // argument is parsed as t: Test{ type Blocked = Boolean }

Blocked становится буквальным одноэлементным типом false; обратите внимание, как f(true) отклоняется ниже

      scala> trait Test{
     |     type Blocked <: Boolean
     | }
trait Test

scala> val v = new Test { type Blocked = false }
val v: Test{type Blocked = false} = $anon$1@34aa8b61

scala> def f(x: v.Blocked) = x
def f(x: v.Blocked): v.Blocked

scala> f(false)
val res0: v.Blocked = false

scala> f(true)
         ^
       error: type mismatch;
        found   : Boolean(true)
        required: v.Blocked
           (which expands to)  false

Другие вопросы по тегам