简体   繁体   中英

What is the type for scala.util.Random.shuffle?

Background

I started out with a Shuffler class that does two things:

  1. Shuffles n:Int indexes
  2. Puts them into n_tranches:Int

I am trying to refactor this code such that almost the entire implementation is in Trancheur, which puts the indexes into n_tranches.

For example, I may want to put 50 cards into 6 stacks, which I call tranches.

Original Code

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)
  }
}

New Code

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)
  }
}

Problem

I want Shuffler to call Trancheur with the functor scala.util.Random.shuffle . I think the call is fine.

But as a default, I want the Trancheur to have an identity functor which does nothing: it just returns the same results as before. I am having trouble with the constructor signature and with what to define as the identity functor.

NOTE: I apologize in advance if I have used the wrong term in calling scala.util.Random.shuffle a functor - that's what we call it in C++. Not sure if Functor means something else in Scala.

shuffle is a function. So shuffler (the parameter) should expect a function. For your case Seq[Int] => Seq[Int] should be sufficient. Scala also provides a predefined identity function.

This should do it:

class Trancheur( n:Int, n_tranches:Int, shuffler: Seq[Int] => Seq[Int] = identity)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM