ジェネリック 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)}
私が知る限り、唯一の大きな違いは、部分関数を使用していないことです。
誰でもこの動作を説明できますか?