Я пытаюсь создать шаблон проектирования с trait
или class
:
class Collection(input: F[A]) {
def combineWith(other: Collection): Collection
def combineWith(other: A): Collection
}
С F
, являющимся Set
, List
, Seq
и т. Д. ...
И A
типа Item
:
class Item(....) {
def wrap: Collection[Item]
}
Я пытался, но попадаю в цикл, когда элементу нужны типы коллекции, а коллекции - типпредмет, и он выходит из-под контроля, ха-ха.
Я уверен, что должен быть шаблон для повторного использования, но я не могу его найти.
Я начинаю использовать ScalaZ
, поэтому, если есть что-то, что я могу использовать там, это было бы здорово.
Конечная цель - создать пару Item <-> Collection
, где коллекция можетПринимайте только тот товар подходящего типа, где этот предмет может быть только в этой коллекции.И иметь возможность идти вперед и назад с wrap
и иметь возможность добавлять коллекции:
Item +: Collection
Item |+| Item
Collection :+ Item
Collection ++ Collection
Все эти операции должны возвращать Collection
.У меня их несколько в проекте, и я не хочу копировать и вставлять один и тот же код везде.
Редактировать: Пример:
Представьте себе case class Human(body: Body)
и class Body(limbs: List[Limbs])
Вы можете иметь методы для body
, которые будут проходить через limbs
и случаи, когда вы хотите иметь дело с телом в целом.
Как лучше всего это представить?
Редактировать:
Разве этот паттерн не является Монадой или одним из этих Функторов и т. Д....?
Если я сделаю что-то вроде:
class MyCollection(item: Item*) {
def map(f: Item => Item): MyCollection
def flatMap(f: Item => MyCollection): MyCollection
def filter(p: Item => Boolean): MyCollection
}
Будет ли это работать?
Что-то вроде: https://scastie.scala -lang.org / xn304lefRbO7vjwhopgE8g
нет?