Хобрук: Ваш путь к мастерству в программировании

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

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 о головоломке.


  • Как правило, это невозможно и обычно означает ошибку проектирования. Я бы начал с проверки того, используете ли вы библиотеку по назначению или можете использовать другую библиотеку. - В любом случае, для простых типов вы можете сделать это: def extract[T : ClassTag](list: List[Any]): List[T] = list.collect { case t: T => t } и вы можете назвать это так: extract[Int](c) (если хотите, вы можете кодифицировать это как метод расширения). Но имейте в виду, что для сложных типов, таких как extract[List[String]], это не удастся. 27.10.2019
  • @LuisMiguelMejíaSuárez Комментарии предназначены для заметок и вопросов по самому вопросу. Такие ответы действительно должны быть в ответе, а не в комментарии. 28.10.2019

Ответы:


1

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

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, вы можете просто отказаться от второго случая.

27.10.2019
Новые материалы

Разработчики — Избегайте сложностей глупо
Сложность управляется, а не побеждается «Простота — великая добродетель, но для ее достижения требуется тяжелая работа и образование, чтобы оценить ее. И что еще хуже: сложность продается..

Как сделать HTML динамическим с помощью JavaScript
Код JavaScript выполняется внутри страниц сайта. Таким образом, страница вашего сайта содержит метки HTML, а также пояснения (скрипты), составленные с использованием диалекта сценариев, такого как..

Деревья классификации и регрессии
Это мой второй пост об алгоритмах машинного обучения. Мой первый пост посвящен искусственным нейронным сетям, вы можете найти его ниже. Нейронные сети — базовое..

HMTL - Многозадачное обучение для решения задач НЛП
Достижение результатов SOTA путем передачи знаний между задачами Область обработки естественного языка включает в себя десятки задач, среди которых машинный перевод, распознавание именованных..

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..