Scala: обнаружение и извлечение чего-то более конкретного из коллекции значений Any - PullRequest
0 голосов
/ 27 октября 2019

Scala: обнаружение и извлечение чего-то более конкретного из коллекции Any значений.

(Мотивация: Седловая библиотека - единственная найденная мной библиотека Scala, которая предоставляетТип фрейма, который имеет решающее значение для науки о данных, приводит меня к этой загадке. Подробности см. В последнем разделе.)

Проблема

Представьте коллекцию c типа C[Any]. Предположим, что некоторые элементы c относятся к типу T, который строго более специфичен, чем Any.

. Я хотел бы найти способ найти все элементы типа T, изатем создать объект d типа C[T], а не C[Any].

Некоторый код, демонстрирующий проблему

scala> val c  = List(0,1,"2","3")
<console>:11: warning: a type was inferred to be `Any`;
this may indicate a programming error.
       val c  = List(0,1,"2","3")
                ^
c: List[Any] = List(0, 1, 2, 3)

scala> :t c(0)
Any // I wish this were more specific

// Scala can convert some elements to Int.
scala> val c0 = c(0) . asInstanceOf[Int]
c0: Int = 0
// But how would I detect which?

scala> val d = c.slice(0,2)
d: List[Any] = List(0, 1) // I wish this were List[Int]

Мотивация: почему библиотека Saddle приводит меня к этомузадача

Седло позволяет вам манипулировать "Рамками" (таблицами). Рамки могут иметь столбцы разных типов. Некоторые системы (например, Pandas) назначают отдельный тип каждому столбцу. Однако каждый кадр в Saddle имеет ровно три параметра типа: тип меток строк, тип меток столбцов и тип ячеек.

Данные реального мира обычно представляют собой смесь строк и чисел. То, как такие таблицы представлены в Saddle, - это Frame с типом ячейки Any. Я бы хотел понизить (upcast? полиморфизм - трудный ) столбец до чего-то более специфического, чем значения Series of Any. Я также хотел бы иметь возможность протестировать столбец, чтобы убедиться, что приведение правильное.

Я опубликовал проблему на сайте Saddle's Github по поводу головоломки.

1 Ответ

1 голос
/ 27 октября 2019

Вы можете сделать что-то вроде этого

scala> val c  = List(0,1,"2","3")
c: List[Any] = List(0, 1, 2, 3)
scala> c.collect { case x: Int => x; case s: String => s.toInt  }
res0: List[Int] = List(0, 1, 2, 3)

Если вы просто хотите использовать типы Int, вы можете просто отбросить второй случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...