gpt4 book ai didi

Scala 类型类隐式解析

转载 作者:行者123 更新时间:2023-12-04 20:31:57 25 4
gpt4 key购买 nike

(斯卡拉 2.11.8)

考虑以下代码:

object ScalaTest extends App {
class Wrapper {
import Wrapper._

def init(): Unit = {
// "could not find implicit value for parameter tc: ScalaTest.Wrapper.TC[Int]"
printWithTC(123)

// Compiles
printWithTC(123)(IntTC)

// Compiles again!
printWithTC(132)
}
}

object Wrapper {
trait TC[A] {
def text(a: A): String
}

implicit object IntTC extends TC[Int] {
override def text(a: Int) = s"int($a)"
}

def printWithTC[A](a: A)(implicit tc: TC[A]): Unit = {
println(tc.text(a))
}
}

(new Wrapper).init()
}

我有一堆关于这段代码的问题:
  • 为什么不IntTC得到解决摆在首位?
  • 为什么用一次就编译? (如果您注释掉第一次调用,代码有效)
  • typeclass 隐式应该放在哪里才能正确解析?
  • 最佳答案

    使用 val具有显式返回类型。见 https://github.com/scala/bug/issues/801https://github.com/scala/bug/issues/8697 (除其他外)。
    隐式对象与具有推断返回类型的隐式 vals 和 defs 具有相同的问题。至于你的第二个问题:什么时候IntTC显式使用您强制编译器对其进行类型检查,因此在此之后它的类型是已知的并且可以通过隐式搜索找到。

    class Wrapper {
    import Wrapper._

    def init(): Unit = {
    // Compiles
    printWithTC(123)

    // Compiles
    printWithTC(123)(IntTC)

    // Compiles
    printWithTC(132)
    }
    }

    object Wrapper {
    trait TC[A] {
    def text(a: A): String
    }

    implicit val IntTC: TC[Int] = new TC[Int] {
    override def text(a: Int) = s"int($a)"
    }

    def printWithTC[A](a: A)(implicit tc: TC[A]): Unit = {
    println(tc.text(a))
    }
    }

    如果你真的希望你的隐式像对象一样被懒惰地评估,你可以使用 implicit lazy val具有显式类型。

    关于Scala 类型类隐式解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44282082/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com