2

ジェネリック Seq がソートされているかどうかをチェックする関数を定義しようとしました。

私はこれを思いついた:

import Ordering.Implicits._

def isOrdered[A: Ordering](seq: Seq[A]): Boolean =
  seq.sliding(2).map({ case List(a, b) => b > a }).forall(identity)

その時点で、コンパイラは「A に対して暗黙的な順序付けが定義されていません」をスローします。

a と b を次のように指定することで、これを回避できます。

def isOrdered[A: Ordering](seq: Seq[A]): Boolean =
  seq.sliding(2).map({ case List(a: A, b: A) => a < b }).forall(identity)

その時点で、コンパイラは喜んで関数を受け入れます。

興味深いのは、次の実装がそのまま使用できることです。

def isOrdered[A: Ordering](seq: Seq[A]): Boolean =
  seq.sliding(2).exists{s => s(0) > s(1)}

私が知る限り、唯一の大きな違いは、部分関数を使用していないことです。

誰でもこの動作を説明できますか?

4

2 に答える 2

0

最初のケースでは、

{ case List(a, b) => b > a }

部分関数を定義したばかりで、それらの要素の順序付けを定義していないため、これは機能しません。その意味では、とcase List(a,b)を含むリストを表します。今は何でも意味があります。typeの 2 つの要素を含む List であることを定義したため、機能しますabaa:A, b:AA

の順序付けを定義したためAです。したがって、2番目の作品。

3 番目のとおり:seq.sliding(2).を返しますIterator[List[A]]List[A]イテレータのそれぞれについて、 を呼び出していs(0) > s(1)ます。ここでs(0)ands(1)はタイプAです。bound を定義したのでA: Ordering、 type の順序が定義されましAた。この場合s(0) s(1)。したがって、それは機能します。

于 2013-08-05T13:02:21.433 に答える