Liskov
Scala標準ライブラリの<:<
と同じような役割をするものです。
本体にメソッドはそれほど多くなく、7.3.8時点で以下のような定義です。 (シグネチャのみで、実装は省略しています)
sealed abstract class Liskov[-A, +B] {
def apply(a: A): B
def substCo[F[+_]](p: F[A]): F[B]
def substCt[F[-_]](p: F[B]): F[A]
def *[x[+_, +_], C, D](that: Liskov[C, D]): Liskov[A x C, B x D]
def andThen[C](that: Liskov[B, C]): Liskov[A, C]
def compose[C](that: Liskov[C, A]): Liskov[C, B]
def onF[X](fa: X => A): X => B
}
コンパニオンオブジェクトに<~<
と>~>
というaliasが定義されていて、基本的にはこのaliasが使われます。
type <~<[-A, +B] = Liskov[A, B]
type >~>[+B, -A] = Liskov[A, B]
def apply(a: A): B
に関しては、Scala標準ライブラリのものと全く同じ用途です。scalaz.Liskovが優れているのは、その他にもいくつかのメソッドを持っている点です。
ただし、Scala 2.13 からは、Scala本体にも同様のメソッドが入っています。
Add substitute methods and tests
Liskovに関しては、以下の記事も読むとよいでしょう。