Обеспечить строгий сбор

Есть ли простой способ использования системы типов Scala и, в идеале, без дополнительных затрат времени выполнения для обеспечения строгих коллекций? Мне бы понравилось что-то вроде приведенного ниже, но, просматривая API коллекций Scala, я не вижу такой иерархии. Я бы предпочел не использовать белый список строгих коллекций, но если это единственный способ, я буду жить с ним.

case class Foo(xs: immutable.StrictSeq[Int])

Какую большую проблему вы пытаетесь решить? Обычно, если меня беспокоит, что вызывающие абоненты изменяют сохраненную коллекцию, я просто создаю ее неизменяемую копию внутри и использую ее.

Joe K 26.09.2018 22:11

Проблема в том, что у меня есть древовидная структура с несколькими последовательностями в ключевом общедоступном API. Обычный шаблон, который люди используют для извлечения информации из него, - это рекурсивный обход структуры и заполнение изменяемых структур данных. Если вы затем случайно вставите ленивую коллекцию в дерево, ничего не получится. Шаблон сомнительный, но широко используемый, поэтому моя цель - найти способ предотвратить попадание людей в ногу.

Jack Koenig 26.09.2018 22:40
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Scala Seq не собирает достаточно информации, чтобы решить, являются ли они строгими или нет.

Вы можете внести в белый список последовательности, которые вы примете, следующим образом:

import scala.language.higherKinds

// Tag for sequences that are strict.
sealed trait StrictSeq[T[_] <: Seq[_]]

object StrictSeq {
  // Evidence for the compiler that lists and vectors are strict.
  implicit object ListIsStrict   extends StrictSeq[List]
  implicit object VectorIsStrict extends StrictSeq[Vector]
}

// Restrict S to be a sequence and to have been tagged as strict.
case class Foo[S[_] <: Seq[_] : StrictSeq](xs: S[Int])

Foo(List(1, 2, 3))    // OK
Foo(Vector(1, 2, 3))  // OK
Foo(Stream(1, 2, 3))  // Compile-time error

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