scala - 从嵌套类型获取子类型
问题描述
我看不到获取嵌套类型子类型的方法,有可能吗?
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 - 它们是状态,我想实现路径可靠的对象:
- C - 必须仅从A OR B初始化
- 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
解决方案
您必须按照以下方式进行:
trait IN[A, B] {
type X = A
type Y = B
}
trait INH[T <: IN[_, _]] {
type X = T#X
type Y = T#Y
}
推荐阅读
- reactjs - 无法在反应中添加图像出现错误错误:使用要求时找不到模块'./undefined'
- angular - ionic:连续打印每张照片
- python - 无法将多个csv文件导入pandas并在Python中连接到一个DataFrame
- javascript - ExcelJS节点:页面中的水平居中和垂直居中不起作用
- google-apps-script - 将 PDF 转换为 Google 文档并将提取的文本以及原始 PDF 文件的链接提取到电子表格中
- sql - Return all customers that have ordered KFC for two consecutive orders
- xamarin - Xamarin 形成方形按钮网格
- https - 启动 Kestrel 服务器时未使用 ApplicationManifest 中的 EndpointCertificate
- java - 试图创建一个我可以进一步操作的学生数据库
- java - 如何更改具有增强的 for 循环的方法,该方法将方法调用返回到 Java 中的 Stream?