[英]Behavior of shuffle on Set vs List using scala.util.Random
[英]What is the type for scala.util.Random.shuffle?
背景
我从一个Shuffler类开始做两件事:
我试图重构这个代码,几乎整个实现都在Trancheur中,它将索引放入n_tranches。
例如,我可能想将50张卡放入6个堆栈中,我称之为tranches。
原始代码
class Shuffler( n:Int, n_tranches:Int )
{
val v = scala.util.Random.shuffle( (0 to n-1).toVector )
// returns tranche[0,n_tranches-1] which we live in
def tranche( i:Int ) = idxs(i).map( v ).sorted.toVector
private val idxs = cut( 0 to (n-1), n_tranches ).toVector
private def cut[A](xs: Seq[A], n: Int) = {
val (quot, rem) = (xs.size / n, xs.size % n)
val (smaller, bigger) = xs.splitAt(xs.size - rem * (quot + 1))
smaller.grouped(quot) ++ bigger.grouped(quot + 1)
}
}
新规范
class Shuffler( n:Int, n_tranches:Int )
extends Trancheur( n, n_tranches, scala.util.Random.shuffle )
{
}
class Trancheur( n:Int, n_tranches:Int, shuffler ) // WHAT SHOULD I PUT HERE?!?!?!?
{
val v = shuffler( (0 to n-1).toVector )
// returns tranche[0,n_tranches-1] which we live in
def tranche( i:Int ) = idxs(i).map( v ).sorted.toVector
private val idxs = cut( 0 to (n-1), n_tranches ).toVector
private def cut[A](xs: Seq[A], n: Int) = {
val (quot, rem) = (xs.size / n, xs.size % n)
val (smaller, bigger) = xs.splitAt(xs.size - rem * (quot + 1))
smaller.grouped(quot) ++ bigger.grouped(quot + 1)
}
}
问题
我希望Shuffler用函子scala.util.Random.shuffle
调用scala.util.Random.shuffle
。 我觉得这个电话很好。
但作为默认值,我希望Trancheur拥有一个不执行任何操作的标识函数:它只返回与之前相同的结果。 我遇到了构造函数签名以及定义为身份函子的问题。
注意:如果我在调用scala.util.Random.shuffle
函数时使用了错误的术语,我会事先道歉 - 这就是我们在C ++中所称的。 不确定Functor在Scala中是否意味着其他内容。
shuffle
是一种功能。 所以shuffler(参数)应该期待一个函数。 对于您的情况, Seq[Int] => Seq[Int]
应该足够了。 Scala还提供预定义的身份功能。
这应该这样做:
class Trancheur( n:Int, n_tranches:Int, shuffler: Seq[Int] => Seq[Int] = identity)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.