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 по поводу головоломки.