All You Need Is

Order (Cats)

ScalaCats関数型プログラミング

Order

Order順序が定義されていることを表す型クラス。

cats の Ordercompare メソッドが定義されたトレイトとして定義されている。

1
trait Order[@sp A] extends Any with PartialOrder[A] { self =>
2
3
def compare(x: A, y: A): Int
4
5
def comparison(x: A, y: A): Comparison = Comparison.fromInt(compare(x, y))
6
7
def partialCompare(x: A, y: A): Double = compare(x, y).toDouble
8
9
def min(x: A, y: A): A = if (lt(x, y)) x else y
10
11
def max(x: A, y: A): A = if (gt(x, y)) x else y
12
13
override def eqv(x: A, y: A): Boolean =
14
compare(x, y) == 0
15
16
override def neqv(x: A, y: A): Boolean = !eqv(x, y)
17
18
override def lteqv(x: A, y: A): Boolean =
19
compare(x, y) <= 0
20
21
override def lt(x: A, y: A): Boolean =
22
compare(x, y) < 0
23
24
override def gteqv(x: A, y: A): Boolean =
25
compare(x, y) >= 0
26
27
override def gt(x: A, y: A): Boolean =
28
compare(x, y) > 0
29
30
def toOrdering: Ordering[A] =
31
compare(_, _)

compare 以外のメソッドは compare を使ったデフォルト実装となっている。 Cats Type Classes の図で PartialOrder がハイライトされていないため先に Order を確認している。しかし、PartialOrder で実装を要求しているメソッドは事前に把握しておかないといけない。 PartialOrder では partialCompare の実装を要求しているが Order では compare を使って partialCompareeqv を実装できるため、最終的に Order として compare さえ定義できれば EqPartialOrder のインスタンスとしても扱えるようになっている。

OrderEq.fromUniversalEquals のような呼ぶだけで Order のインスタンスを返してくれるようなメソッドは用意されていないようなのでインスタンスを自分で定義するか derive を使って定義しないといけない。

1
import cats.Order
2
3
case class Fahrenheit(value: Double)
4
5
given Order[Fahrenheit] = Order.from((x, y) => x.value.compareTo(y.value))

derives でインスタンスを導出するためにはすべてのフィールドについて Order のインスタンスが定義されてなければならない。

Order 型クラスの定義は数学における全順序の定義を知っていれば特筆すべき点はない。ただ、半順序 (PartialOrder) は離散数学で習う概念 (高校数学ではなかったのか…) なので大学数学をやっていない人にとっては馴染みがないかもしれない。それがハイライトされていない理由なのかもしれない。

Order のシンタックス

型クラスシンタックス説明
Ordercompare左辺を右辺を比較し、左辺が小さいときは負の値を返し、大きいときは正の値を返す。値が等しいときは 0 を返す。
Ordermin左辺と右辺で小さい値を返す。
Ordermax左辺と右辺で大きい値を返す。
OrdercomparisonComparison を返す。Haskell の Ordering 相当の値。
ParitalCompare>左辺が右辺より大きいときは true を返す。
ParitalCompare>=左辺が右辺以上のときは true を返す。
ParitalCompare<左辺より右辺が大きいときは true を返す。
ParitalCompare<=左辺が右辺以下のときは true を返す。
ParitalComparepartialComparecompare と同じ。
ParitalComparepartialComparisonComparison と同じ。

Buy Me A Coffee