【发布时间】:2014-04-24 12:46:36
【问题描述】:
我在定义类型构造函数以消除 Scala 中用于部分类型应用程序的可怕的 type-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]]
}
假设我有这个方法:
def name[S <: Sys[S]](p: Proc[S]): String =
p.attribute[({type A[~ <: Sys[~]] = Expr[~, String]})#A]("name")
.fold("<unnamed>")(_.value)
我想这样定义它:
def name[S <: Sys[S]](p: Proc[S]): String =
p.attribute[XXX[String]]("name").fold("<unnamed>")(_.value)
问题是:如何定义类型构造函数XXX[A]?
我的想法是这样的:
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
^
【问题讨论】: