2016-03-26 13 views
2

は、私は次のrepoこのクイックソートコードでは、この `@ sp`構文は何ですか?

object QuickSort { 
    @inline final def limit: Int = 16 

    final def sort[@sp A:Order:ClassTag](data:Array[A]): Unit = qsort(data, 0, data.length - 1) 

    final def qsort[@sp A](data:Array[A], left: Int, right: Int)(implicit o:Order[A], ct:ClassTag[A]): Unit = { 

     if (right - left < limit) return InsertionSort.sort(data, left, right + 1) 

     val pivot = left + (right - left)/2 
     val next = partition(data, left, right, pivot) 
     qsort(data, left, next - 1) 
     qsort(data, next + 1, right) 
    } 

    final def partition[@sp A](data:Array[A], left:Int, right:Int, pivot:Int)(implicit o:Order[A], ct:ClassTag[A]): Int = { 

     val value = data(pivot) 

     //swap(pivot, right) 
     var tmp = data(pivot); data(pivot) = data(right); data(right) = tmp 

     var store = left 
     var i = left 
     while (i < right) { 
     if (o.lt(data(i), value)) { 
      //swap(i, store) 
      tmp = data(i); data(i) = data(store); data(store) = tmp 
      store += 1 
     } 
     i += 1 
     } 
     //swap(store, right) 
     tmp = data(store); data(store) = data(right); data(right) = tmp 
     store 
    } 
    } 

[@sp A]の目的は何であるから、このクイックソートのコードを理解しようとしていますか?私は[A]構文がジェネリックであることを知っていますが、追加するものは何ですか@spは何ですか?誰かがこれについていくつかの洞察を発することができますか?

おかげ

答えて

6

@spspire package objectに定義されている@specializedの別名です。

我々は専門を使用している尖塔で、そう@specializedを記述することや、輸入に名前変更があまりにも退屈だたくさん。

spireパッケージオブジェクトからの定義は、個別のパッケージ文がある場合にのみ表示されるフォームサブパッケージになります。

これがない

package spire.math 

class Foo[@sp T] 

同じアプローチは、Scalaの標準ライブラリで使用されてしまうのに対しだから、これは

package spire 
package math 

class Foo[@sp T] 

に動作します。 scala.collection.immutable.Setのようなクラスを見ると、packageステートメントは3つの部分で行われることに注意してください。

package scala 
package collection 
package immutable 
関連する問題