2016-04-22 6 views
4

partial orderは数学的な観点から理解していますが、Scalaライブラリのタイプクラスはどこでどのように使用できますか。標準ライブラリ全体を検索したところ、使用方法は1つしかありません。Orderingによって拡張されました。その基本的な方法については同じ話tryCompare、それはどこにも使われていないようです。ScalaライブラリのPartialOrderingの目的

object PartialFoo extends PartialOrdering[Foo] { 
    def tryCompare(a: Foo, b: Foo): Option[Foo] = { 
    if (a.x != b.x) None // Doesn't make sense to compare foos with different xs 
    else ??? 
    } 
} 

UPD:代わりの

case class Foo(x: Int, y: String) 

val order = Ordering.by { foo => (foo.x, foo.y) } 

は、私はより多くのドメイン正しいインスタンスを実装する場合

だから、何のメリット私が持つことができるそれはまたリターンで特色definedを注文するように思えますSome[Int]Option[Int]ではない)と入力しても、無効にすることはできません。それは意図的ですか?

+3

標準ライブラリは、このような謎に満ちている、と私は思い「誰かがこれを何らかの点で含めることを首尾よく主張した」よりも良い答えがあるかどうかはわかりません。 –

+0

また、Scalaのコードベースで使用されているのを覚えている唯一の場所は、Algebirdです。 –

答えて

1

これはタイプの自然な部分的順序を表すタイプのクラスのテンプレートと思われます。

これらのクラスのポイントは明示的に使用するのではなく、ユーザーがそのような自然タイプのクラスを使用できるタイプにしか適用できないメソッドにアクセスできるように暗黙的にライブラリにあります。

たとえば、sumコレクションメソッドの暗黙のパラメータであるNumericタイプのクラスは、val x = List(1, 2, 3).sumのようなものを実行したときに実際には明示的に提供されません。 代わりに、scalaはデフォルトでスコープ内にNumeric[Int]オブジェクトをインポートします。これにより、コンパイラはintの総和を「知る」ことができます。 PartiallyOrderedの同類の形質を作成し、必要

  1. :1は自然半順序を持つ要素のための唯一の「仕事」を希望する方法を開発した場合

    同様に、二つの選択肢があることになりますこの型の引数 - これは非常に柔軟ではありません。ANYコレクションで呼び出すことのできるsumメソッドと比較するだけです。

  2. PartialOrdering[T]の暗黙のパラメータをメソッドに追加し、目的の型の実装を作成します。

私も注文を実装していないPartialOrderingの任意の実際の実装を見つけることはできませんが、このクラスを持つことは、それはPartialOrderingを実装したい任意のユーザーを手段として、まだ良いことですが、注文ではありません、 はPartialOrdering'sを使用してOrderをメソッドに渡すこともできます。例えば。などのInt、文字列、

だから私はクラスAと半順序

APartialOrdering extends PartialOrdering[A]を作成すると言います。

私のタイプAは自然順序付けを認めていないので、部分的なものだけが認められます。最後に、私はタイプAのオブジェクトを渡すことができ、

def doSomethingForPartiallyOrdered[T](t: T)(implicit po: PartialOrdering[T]) = _

今メソッドを作成するだけでなく、のIntの、ストリングスなど

+2

私はOPがどのような型のクラスであるかを知っていて、Scalaでどのようにエンコードされているのかは分かりませんが、それは問題ではないようです。また、最後の文章が何を意味するのかは不明です。「Ordering」が期待される場所では、PartialOrderingを提供することはできません。 –

+0

いいえ、パーシャルオーダーの代わりにオーダーを提供することは可能です。私はそれをより明確にするでしょう –

関連する問題