5

関連する一連のルーチンを持つオブジェクトがあり、それらの宣言はすべて同じように見えます。

object Sorting {
  def qsort[a <% Ordered[a]] ....

  def partition[a <% Ordered[a]] ...

  def qselect[a <% Ordered[a]] ...
}

型制約を 1 か所で指定し、宣言を次のようにqsort[a](xs: Stream[a])、またはそれ以上に削減する方法はありますqsort(xs: Stream[a])か?

当分の間、暗黙のクラスを使用することにしました

object Implicits {
  implicit class SortableArray[a <% Ordered[a]](xs: Array[a]) {
    def qsort = {...}
  }
}

object Application {
  import Implicits._
  def main(args: Array[String]) = {
    val xs = Array(1,2,3)
    xs.qsort
  }
}
4

2 に答える 2

3

残念ながら、タイプを として宣言することはできませんtype U[T] = T <% Ordered[T]。これは機能せず、コンパイルさえできません。

ただし、コードに適用できるいくつかの回避策があります

この思考フローを確認してください:

ここで説明されているように:

def f[A <% B](a: A) = a.bMethod

と同じです

def f[A](a: A)(implicit ev: A => B) = a.bMethod

この

def g[A : B](a: A) = h(a)

と同じです

def g[A](a: A)(implicit ev: B[A]) = h(a) .

例に戻ります:

def qsort[A <% Ordered[A]] = ???

... に翻訳されます:

def qsort[A](implicit ev: A => Ordered[A]) = ???

...これで、次のような型パラメーターを導入できます。

type O[A] = A => Ordered[A]

...そしてそれを次のように使用します:

def gsort[A] (implicit ev: O[A])

...次のように簡略化できます。

def gsortX[A : O]

次に、次のように記述できるすべてのコード:

object Sorting {

  def qsort[A <% Ordered[A]] = ???

  def partition[A <% Ordered[A]] = ???

  def qselect[A <% Ordered[A]] = ???
}

object Sorting {

  type O[A] = A => Ordered[A]

  def qsort[A: O] = ???

  def partition[A: O] = ???

  def qselect[A: O] = ???
}

または、特性を使用するとさらに良い

trait Sorting[A] {
  type O = A => Ordered[A]
  implicit def f : O

  def qsort = ???

  def partition = ???

  def qselect = ???
}

これが何らかの形で役立つことを願っています:)

于 2013-10-09T09:39:22.053 に答える