如何在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的类型,确定Bsubst用于g方法的目的;碰巧,在这种情况下,A=AB=B,但如果你想要非常清楚,你应该重命名trans的那些类型参数。

现在拿你的类型函数:

`-α` => α <~< C

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

以上是关于如何在scalaz中减少Liskov的trans函数?的主要内容,如果未能解决你的问题,请参考以下文章

Scalaz,*语法类的目的

如何创建在创建后立即异步运行的 ScalaZ 任务?

Scala (scalaz) State monad - 映射到 Option 状态类型

创建和使用没有 sbt 的独立 scalaz jar

在 JavaScript 或 jQuery 中增加和减少数量时如何计算价格?

ReadOnlyCollection vs Liskov - 如何正确建模可变集合的不可变表示