首页 > 解决方案 > 从嵌套类型获取子类型

问题描述

我看不到获取嵌套类型子类型的方法,有可能吗?

type IN[A,B] = {
  type X = A
  type Y = B
}

trait INH[IN[A,B]] {
  type X = IN#X
  type Y = IN#Y 
}

但这不编译...

更新 我将扩展这个案例:
有一些类:A,B,C,N - 它们是状态,我想实现路径可靠的对象:

  1. C - 必须仅从A OR B初始化
  2. D - 必须仅从A OR B OR C初始化
abstract class State

trait UN[T <: |∨|[_, _]] {
  type U[I] = T#λ[I]
}

case class A() extend State
case class B() extend State
case class C(state: State) extend State with UN[(A |∨| B)]
case class D(state: State) extend State with UN[(A |∨| B |∨| C)]
case class Z() extend State

所以 Curry Howard 对联合类型的定义:

type ![S] = S => Nothing
type !![S] = ![![S]]
type ∨[T, U] = ![![T] with ![U]]
type |∨|[T, U] = { type λ[X] = !![X] <:< (T ∨ U) }

所以我正在尝试做类似的事情,但没有成功:

case class C(state: State) {
   def test[T <: State](t:T)(implicit ev: (A |∨| B)#λ[T]) = {}
   def apply[T <: State](state: T)(implicit ev: (A |∨| B)#λ[T]) = C(state)
}

val a = A(); val b = B(); val z = Z()
val ca = C(a); val cb = C(b)
ca.test(a) // compilation OK
val cz = C(n) // that shouldn't compile but it's

标签: scala

解决方案


您必须按照以下方式进行:

trait IN[A, B] {
  type X = A
  type Y = B
}

trait INH[T <: IN[_, _]] {
  type X = T#X
  type Y = T#Y
}

推荐阅读