Scala 定义类型构造函数以生成类型lambda(部分应用的类型)

Scala 定义类型构造函数以生成类型lambda(部分应用的类型),scala,higher-kinded-types,Scala,Higher Kinded Types,我在定义类型构造函数以消除Scala中对部分类型应用程序的可怕类型lambda方法时遇到问题。鉴于: trait Sys[S <: Sys[S]] trait Expr[S <: Sys[S], +A] { def value: A } import reflect.ClassTag trait Proc[S <: Sys[S]] { def attribute[A[~ <: Sys[~]]](key: String)

我在定义类型构造函数以消除Scala中对部分类型应用程序的可怕类型lambda方法时遇到问题。鉴于:

trait Sys[S <: Sys[S]]

trait Expr[S <: Sys[S], +A] {
  def value: A
}

import reflect.ClassTag

trait Proc[S <: Sys[S]] {
  def attribute[A[~ <: Sys[~]]](key: String)
                               (implicit tag: ClassTag[A[S]]): Option[A[S]]
}
但它只会产生

<console>:52: error: type Ex takes type parameters
       type XXX[A] = ({type Ex[S <: Sys[S]] = Expr[S, A]})#Ex
                                                           ^
:52:错误:type Ex接受类型参数

类型XXX[A]=({type Ex[S我似乎找不到除了保持类型投影之外的其他解决方案,只有更短的:

trait Ex[A] { type L[S <: Sys[S]] = Expr[S, A] }

def name[S <: Sys[S]](p: Proc[S]): String = 
  p.attribute[Ex[String]#L]("name").fold("<unnamed>")(_.value)
trait Ex[A]{type L[S
type XXX[A] = ({type Ex[S <: Sys[S]] = Expr[S, A]})#Ex
<console>:52: error: type Ex takes type parameters
       type XXX[A] = ({type Ex[S <: Sys[S]] = Expr[S, A]})#Ex
                                                           ^
trait Ex[A] { type L[S <: Sys[S]] = Expr[S, A] }

def name[S <: Sys[S]](p: Proc[S]): String = 
  p.attribute[Ex[String]#L]("name").fold("<unnamed>")(_.value)
implicit class RichProc[S <: Sys[S]](val `this`: Proc[S]) extends AnyVal {
  def attrExpr[A](key: String)
                 (implicit tag: ClassTag[Expr[S, A]]): Option[Expr[S, A]] =
    `this`.attribute[({type Ex[~ <: Sys[~]] = Expr[~, A]})#Ex](key)
}

def name[S <: Sys[S]](p: Proc[S]): String = 
  p.attrExpr[String]("name").fold("<unnamed>")(_.value)