我是scalaz的初学者。这是源代码:
sealed abstract class Liskov[-A, +B] {
def apply(a: A): B = Liskov.witness(this)(a)
def subst[F[-_]](p: F[B]): F[A]
final def *[+[+_, +_], C, D](that: Liskov[C, D]): Liskov[A + C, B + D] = Liskov.lift2(this, that)
final def andThen[C](that: Liskov[B, C]): Liskov[A, C] = Liskov.trans(that, this)
final def compose[C](that: Liskov[C, A]): Liskov[C, B] = Liskov.trans(this, that)
def onF[X](fa: X => A): X => B = Liskov.co2_2[Function1, B, X, A](this)(fa)
}
object Liskov extends LiskovInstances {
def trans[A, B, C](f: B <~< C, g: A <~< B): A <~< C =
g.subst[λ[`-α` => α <~< C]](f)
}
我不知道如何为trans
功能进行类型缩减。
首先,通过检查A
的类型,确定B
和subst
用于g
方法的目的;碰巧,在这种情况下,A=A
和B=B
,但如果你想要非常清楚,你应该重命名trans
的那些类型参数。
现在拿你的类型函数:
`-α` => α <~< C
subst
将参数F
应用于值参数中的B
和结果中的A
。因此,对于这个论点,问“当我用B
称这种类型的兰达时会发生什么?”对于结果类型,请问“当我用A
调用这个typelambda时会发生什么?”