如何在scalaz中减少Liskov的trans函数?

问题描述 投票:0回答:1

我是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功能进行类型缩减。

scala scalaz
1个回答
0
投票

首先,通过检查A的类型,确定Bsubst用于g方法的目的;碰巧,在这种情况下,A=AB=B,但如果你想要非常清楚,你应该重命名trans的那些类型参数。

现在拿你的类型函数:

`-α` => α <~< C

subst将参数F应用于值参数中的B和结果中的A。因此,对于这个论点,问“当我用B称这种类型的兰达时会发生什么?”对于结果类型,请问“当我用A调用这个typelambda时会发生什么?”

© www.soinside.com 2019 - 2024. All rights reserved.