Тип 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