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に関しては、以下の記事も読むとよいでしょう。

typelevel.scala | When can Liskov be lifted?

results matching ""

    No results matching ""