Order
の他に、Cats は PartialOrder
も定義する。
import cats._, cats.data._, cats.implicits._
1 tryCompare 2
// res0: Option[Int] = Some(value = -1)
1.0 tryCompare Double.NaN
// res1: Option[Int] = Some(value = -1)
PartialOrder
は Option[Int]
を返す tryCompare
演算を可能とする。
algebra によると、オペランドが比較不能な場合は None
を返すとのことだ。
だけど、1.0
と Double.NaN
を比較しても Some(-1)
を返しているので、何が比較不能なのかは不明だ。
def lt[A: PartialOrder](a1: A, a2: A): Boolean = a1 <= a2
lt(1, 2)
// res2: Boolean = true
lt[Int](1, 2.0)
// error: type mismatch;
// found : Double(2.0)
// required: Int
// lt[Int](1, 2.0)
// ^^^
PartialOrder
は他にも >
, >=
, <
, そして <=
演算子を可能とするが、これらは気をつけないと標準の比較演算子を使うことになるのでトリッキーだ。