我只是想知道,我可以在 Scala 中将元组类型分解为其组件的类型吗?
我的意思是,像这样
trait Container {
type Element
}
trait AssociativeContainer extends Container {
type Element <: (Unit, Unit)
def get(x : Element#First) : Element#Second
}
本质上,您无法打开包装,但也许这可以达到您想要的效果:
type First
type Second
type Element = (First, Second)
def get(x: First): Second
这不会解包类型,但会限制类型A
和B
调用get
.
trait Container {
type Element
}
trait AssociativeContainer extends Container {
type Element <: Tuple2[_, _]
def get[A, B](x: A)(implicit ev: (A, B) =:= Element): B
}
Element
这看起来很有希望,但在作弊——如果是抽象的,它就行不通。
def Unpack[T<:Tuple2[_, _]] = new {
def apply[A, B](implicit ev: T <:< (A, B)) = new {
type AA = A
type BB = B
}
}
trait AssociativeContainer {
type Element = (Int, String)
val unpacked = Unpack[Element].apply
type A = unpacked.AA
type B = unpacked.BB
1: A
"": B
def get(x: A): B
}
我对此有点晚了,但是使用模式匹配呢?没有完全正确的返回类型,我的语法可能有点不对,但这里是:
def get[K](key: K): Iterable[Any] {
for ((key, x) <- elements) yield x
}