Scala: Обнаружение и извлечение чего-то более конкретного из набора Any
значений.
(Мотивация: Saddle-библиотека — единственная найденная мной библиотека Scala, предоставляющая тип Frame, который имеет решающее значение для науки о данных — приводит меня к этой загадке. Подробнее см. в последнем разделе.)
Проблема
Представьте себе коллекцию 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 в виде фрейма с типом ячейки Any. Я хотел бы преобразовать столбец в нечто большее конкретный, чем серия любых значений. Я также хотел бы иметь возможность протестировать колонку, чтобы убедиться, что актерский состав подходит.
Я опубликовал проблему на сайте Saddle на Github о головоломке.