scala - 通用嵌套类型推断适用于 arity-2,但不适用于柯里化
问题描述
试图弄清楚为什么代码编译为嵌套类型推断的方法与 arity-2 但不是柯里化。
object Test
{
trait Version
object VersionOne extends Version
trait Request[A <: Version]
trait RequestOne extends Request[VersionOne.type]
case class HelloWorld() extends RequestOne
def test1[A <: Version, T <: Request[A]](t : T, a : A): T = t
def test2[A <: Version, T <: Request[A]](t : T)(a : A): T = t
}
// This works
Test.test1(Test.HelloWorld(), Test.VersionOne)
// This doesn't
Test.test2(Test.HelloWorld())(Test.VersionOne)
test2 无法编译并出现以下错误:
错误:(22, 73) 推断类型参数 [Nothing,A$A96.this.Test.HelloWorld] 不符合方法 test2 的类型参数界限 [A <: A$A96.this.Test.Version,T <: A $A96.this.Test.Request[A]] def get$$instance$$res1 = /* ###worksheet### 生成 $$end$$ */ Test.test2(Test.HelloWorld())(Test .版本一)
期待对相同的一些见解。
解决方案
Nothing
编译错误通常意味着某些类型参数没有被推断出来。
尝试明确指定它们
Test.test2[Test.VersionOne.type, Test.RequestOne](Test.HelloWorld())(Test.VersionOne)
test1
和之间的区别test2
不仅在于咖喱。例如,通常 in 的test2(t: ...)(a: ...)
类型a
可以取决于 的值t
。所以 fortest2
类型推断比 for 更复杂test1
。
推荐阅读
- angular - 拆分具有太多属性的类 - 角度
- python - 运行 CMAKE 找不到 python 可执行文件
- swiftui - 在没有导航链接的情况下更改视图 SwiftUI
- python - 如何从 Mac 上的另一个可执行文件/Python 脚本调用可执行文件?
- python-3.x - Heroku Python没有名为Mysql的模块
- android-studio - 如何在 android studio 中为 artifactory 创建 pom 文件?
- javascript - 我怎样才能等待 2 个承诺完成,然后再运行另一个?
- django - django中的slug错误-模板显示每个帖子中的所有帖子数据
- kubernetes - 使用外部 Prometheus 抓取 CoreDNS 指标
- c++ - 索引访问器时的 EXC_BAD_ACCESS (code=EXC_I386_GPFLT)