首页 > 解决方案 > 通用嵌套类型推断适用于 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 .版本一)

期待对相同的一些见解。

标签: scalagenericscurrying

解决方案


Nothing编译错误通常意味着某些类型参数没有被推断出来。

尝试明确指定它们

Test.test2[Test.VersionOne.type, Test.RequestOne](Test.HelloWorld())(Test.VersionOne)

test1和之间的区别test2不仅在于咖喱。例如,通常 in 的test2(t: ...)(a: ...)类型a可以取决于 的值t。所以 fortest2类型推断比 for 更复杂test1

Scala 类型推断和多参数列表

具有类型别名和多参数列表功能的类型推断

未推断出多参数闭包参数类型

Scala中的多个参数列表和每个列表的多个参数有什么区别?


推荐阅读