Можно ли неявно получить сборщик для коллекции, как в старом CanBuildFrom?

У меня есть старый код, который полагался на неявный CanBuildFrom для создания коллекции типа, указанного в качестве параметра типа. Начиная с версии 2.12, в новой библиотеке коллекций замена BuildFrom не предлагает фабричный метод без аргументов Builder. То, что я хочу, это IterableFactory для коллекции, но это сопутствующие объекты, которые не являются неявными. Могу ли я как-то портировать его, не вводя свой собственный неявный фабричный класс, обертывающий Factory для каждого класса коллекции в библиотеке? Я знаю, что у этих фабрик есть много разновидностей, но даже если бы мне пришлось добавить особый случай для тех, кто принимает неявные доказательства, это все равно было бы намного лучше, чем то, что у меня есть.

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

Это помогает? stackoverflow.com/questions/56551015/…

Kolmar 23.12.2020 06:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
238
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать аргументы типа вместо неявных.

def listToString[A, CC[x] <: Iterable[x]](
    list: collection.IterableOps[A, CC, CC[A]]
): CC[String] =
  list.map(x => x.toString)

Использование:

listToString(List(1, 2, 3, 4))
-> List(1, 2, 3, 4): List[String]

listToString(Set("foo", "bar", "baz"))
-> Set(foo, bar, baz): scala.collection.immutable.Set[String]
Ответ принят как подходящий

Если вы хотите создать общую коллекцию поэлементно с помощью Builder и без существующей ранее коллекции, вы можете использовать неявный аргумент Factory. Например:

import scala.collection.Factory

class Filler[T](makeElement: Int => T) {
  def apply[C[_]](n: Int)(implicit factory: Factory[T, C[T]]): C[T] = {
    val builder = factory.newBuilder
    for (i <- 1 to n) builder += makeElement(i)
    builder.result()
  }
}

И вы можете использовать его следующим образом:

scala> val fill = new Filler(_.toString)
fill: Filler[String] = Filler@154f8280

scala> fill[Vector](10)
res0: Vector[String] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> fill[Set](10)
res1: Set[String] = HashSet(8, 4, 9, 5, 10, 2, 7, 3, 6, 1)

scala> fill[Array](10).toSeq
res2: Seq[String] = ArraySeq(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

В стандартной библиотеке есть отдельные неявные Factory для String и Array. И для всех Iterable (List, Map, Set и т. д.) это работает, потому что сопутствующие объекты Iterable расширяют класс IterableFactory, который предоставляет метод implicit def iterableFactory[A]: Factory[A, CC[A]].

Я чувствую себя идиотом. Я не знаю, что я сделал не так, потому что я был уверен, что пробовал это. Может быть, попросили неявный IterableFactory? Ок - спасибо!

Turin 30.12.2020 20:32

Другие вопросы по теме