如何在Scala中使用枚举进行类型推断?

时间:2012-01-23 12:08:53

标签: scala types enums

我在这种风格中有不同类型的枚举

class Gender extends Enumeration {
    type Gender = Value
    val Male,Female = Value
}

我希望有一个给定枚举元素的泛型函数,它在长度为.maxId的数组中放置1(如果你熟悉R,我试图实现 factor < /强>)。但是我无法使这些类型正确,我的功能就像这个(错误的)代码:

def toFactor[T](elem:T.Value):List[Double] = {
  var array = Array.fill(T.maxId)(0.0)
  array(elem.id) == 1.0
  array.toList
}

您如何编写此代码,因此对于我们使用的任何枚举都是通用的?

1 个答案:

答案 0 :(得分:1)

此代码应该这样做:

object Gender extends Enumeration {
    type Gender = Value
    val Male, Female = Value
}

def toFactor[E <: Enumeration, V <: E#Value](enum: E, elem: V): List[Double] = {
  var array = Array.fill(enum.maxId)(0.0)
  array(elem.id) = 1.0
  array.toList
}

println(toFactor(Gender, Gender.Female)) // prints: List(0.0, 1.0)

您需要使用E#Value代替E.Value,因为它通常会告知:所提供的Value Enumeration中的任何EE <: EnumerationE限制为Enumeration的子类。您还需要枚举实例才能获得maxId

更新

您还可以稍微简化toFactor方法,避免使用任何Arrayid s:

def toFactor[T <: Enumeration, V <: T#Value](enum: T, elem: V): List[Double] = 
      enum.values.toList map (curr => if (curr == elem) 1.0 else 0.0)