gpt4 book ai didi

scala - "inlining"val 之后出现奇怪的类型错误

转载 作者:行者123 更新时间:2023-12-02 00:58:21 24 4
gpt4 key购买 nike

我在 shapeless.everywhere 中观察到一个非常奇怪的类型错误。考虑以下菊石脚本,它可以使用 load.module 正常加载:

load.ivy("com.chuusai" %% "shapeless" % "2.3.0")

@

import shapeless._
import poly._

final case class Person(name: Person.Name, age: Person.Age)

object Person {
final case class Name(value: String) extends AnyVal
final case class Age(value: Int) extends AnyVal
}

def happyBirthday(person: Person, howManyYearsPast: Int): Person = {
object incAge extends ->((age: Int) => age + howManyYearsPast)
// THE MAGIC VAL
val oldPerson = everywhere(incAge)(person)
oldPerson
}

val john = Person(Person.Name("John Doe"), Person.Age(42))

val oldJohn = happyBirthday(john, 30)

现在,如果我尝试在此脚本中“内联”MAGIC VAL,即将 val 替换为 everywhere(incAge)(person) code>,我突然得到以下类型错误:

Main.scala:50: type mismatch;
found : person.type (with underlying type cachef6f1545a8d4dc31cb54d9957675f0559.Person)
required: shapeless.poly.Case[_1.type,shapeless.HNil]{type Result = ?} where val _1: shapeless.EverywhereAux[incAge.type]
everywhere(incAge)(person)

什么?

我猜这应该归咎于 scalac 的黑魔法隐式解析,但我难道不知道这里发生了什么吗?如果有人能向我解开这个谜团,那就太好了(而且对我来说肯定有些启发)。

谢谢

最佳答案

我不知道此问题的真正原因,但它是由影响隐式搜索和类型推断的预期类型引起的。您可以通过提供预期类型来使非内联版本不编译:

def happyBirthday(person: Person, howManyYearsPast: Int): Person = {
object incAge extends ->((age: Int) => age + howManyYearsPast)
val oldPerson: Person = everywhere(incAge)(person)
oldPerson
}

此操作失败并出现完全相同的错误。

另一方面,您可以通过从函数中删除预期类型(又名返回类型)来编译内联版本:

def happyBirthday(person: Person, howManyYearsPast: Int) = {
object incAge extends ->((age: Int) => age + howManyYearsPast)
everywhere(incAge)(person)
}

我很确定人们可能会认为这是一个“错误”,但是,类型推断未指定,因此需要一段时间才能弄清楚到底应该发生什么。

关于scala - "inlining"val 之后出现奇怪的类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36725079/

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