我试图创建适用于任何具有收藏的功能take
,slice
和drop
。也就是说,我想创建一个在IndexedSeq[Boolean]
和上工作的函数Vector[Boolean]
,返回相同类型的对象。这是我在查看此如何在Scala中创建通用类型的对象/单个对象之后尝试过的方法?
并尝试使用
IndexedSeqLike
代替Ordering
,但无济于事
trait MutateLike[+T,-Y] {
def apply[U >: T, Y](eo: U): Y
}
case object Mutate extends MutateLike[IndexedSeq[Boolean],IndexedSeq[Boolean]]{
def apply[U >: IndexedSeq[Boolean],IndexedSeq[Boolean]]( eo : U ): IndexedSeq[Boolean] = {
val point = (eo.length * scala.util.Random.nextDouble).toInt
eo.take( point - 1 ) ++ eo.slice( point-1,point ).map(!_) ++ eo.drop( point )
}
}
在尝试了许多其他事情之后。但是,它不起作用,并且会产生误差value length is not a member of type parameter U
。但是U与T是协变的,在这种情况下是IndexedSeq,对吗?任何帮助将不胜感激。
我认为您正在使自己的生活变得比原来复杂得多。尝试这个
case object Mutate{
def apply( eo : IndexedSeq[Boolean] ): IndexedSeq[Boolean] = {
val point = (eo.length * scala.util.Random.nextDouble).toInt
eo.take( point - 1 ) ++ eo.slice( point-1,point ).map(!_) ++ eo.drop( point )
}
}
scala> Mutate( IndexedSeq( true, false, false, true, false, false ) )
res8: IndexedSeq[Boolean] = Vector(false, false, false, true, false, false)
scala> Mutate( Vector( true, false, false, true, false, false ) )
res9: IndexedSeq[Boolean] = Vector(false, false, false, true, false, false)
这只是笔直的,老式的面向对象的多态性。一个Vector[Boolean]
是一个IndexedSeq[Boolean]
,所以它是替代了点。
通过声明MutateLike
和它的方差,您可以决定MutateLike
要从的其他参数继承什么类型的参数化MutateLike
。但这不是您对表达或尝试做的感兴趣的。
(当然,根本不需要使用对象声明。您可以将其定义mutate
为简单函数。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句