在Scala中使用协变不可变集合

杰梅洛

我试图创建适用于任何具有收藏的功能takeslicedrop也就是说,我想创建一个在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章