我正在尝试使用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
和要处理整体的情况。
代表它的最好方法是什么?
修改:
此模式不是Monad还是其中的Functor等之一?
如果我做类似的事情:
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
不?