The Leibniz’ equality law states that if a and b are identical then they
must have identical properties. Leibniz’ original definition reads as follows:
a ≡ b = ∀ f .f a ⇔ f b
and can be proven to be equivalent to:
a ≡ b = ∀ f .f a → f b
This library provides an encoding of Leibniz' equality and other related concepts in Scala. See my impromptu LC 2018 presentation for an overview.
Is[A, B](with a type alias toA === B) witnesses that typesAandBare exactly the same.- Similarly,
IsK[A, B](with a type alias toA =~= B) witnesses that typesA[_]andB[_]are exactly the same. Combinators exist that allow you to prove thatF[A] === F[B]for anyF[_[_]]or thatA[X] === B[X]for anyX. Leibniz[L, H, A, B]witnesses that typesAandBare the same and that they both are in between typesLandH.Is[F, A, B]witnesses type-equality for F-Bounded types.As[A, B]witnesses thatAis a subtype ofB.As1[A, B]witnesses thatAis a subtype ofBusing existential types.Liskov[L, H, A, B]is a bounded counterpart toAs[A, B].Constant[F]witnesses that HKTFis a constant type lambda.Injective[F]witnesses that HKTFis injective (not a constant type lambda 😃).Covariant[F]witnesses that HKTFis covariant (constant or strictly covariant).- Ditto other typeclasses / propositional types in
variancepackage. - See my impromptu LC 2018 presentation for an overview.
resolvers += Resolver.bintrayRepo("alexknvl", "maven")
libraryDependencies += "com.alexknvl" %% "leibniz" % "0.10.0"Code is provided under the MIT license available at https://opensource.org/licenses/MIT, as well as in the LICENSE file.