Как сделать вывод типов с помощью перечислений в Scala? - PullRequest
0 голосов
/ 23 января 2012

У меня есть различные виды перечислений в этом аромате

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

и я хотел бы иметь обобщенную функцию, которая дает элемент перечисления, он помещает 1 в массив длины .maxId (если вы знакомы с 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 Ответ

1 голос
/ 23 января 2012

Этот код должен сделать это:

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 E. E <: Enumeration ограничивает E подклассом Enumeration. Вам также нужен экземпляр enum, чтобы получить maxId.

Обновление

Вы также можете немного упростить метод toFactor и избегать использования любых Array s или id 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...