如何在scalaz中减少Liskov的trans函数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在scalaz中减少Liskov的trans函数?相关的知识,希望对你有一定的参考价值。
我是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时会发生什么?”
以上是关于如何在scalaz中减少Liskov的trans函数?的主要内容,如果未能解决你的问题,请参考以下文章
Scala (scalaz) State monad - 映射到 Option 状态类型