Общий вывод вложенного типа работает с arity-2, но не с карри - PullRequest
0 голосов
/ 13 июня 2019

Попытка выяснить, почему код компилируется для вывода вложенного типа для метода с 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 = / * ### лист ### сгенерированный $$ end $$ * / Test.test2 (Test.HelloWorld ()) (Test.VersionOne) </p>

С нетерпением ждем некоторых идей о том же.

Ответы [ 2 ]

1 голос
/ 13 июня 2019

@ ДмитрийМитин уже объяснил, почему он не работает.

Тем не менее, вы можете решить проблему таким образом, используя Частично примененный тип , вместе с Обобщенные ограничения типа .

def test2[T](t: T): Test2PartiallyApplied[T] = new Test2PartiallyApplied(t)

final class Test2PartiallyApplied[T](private val t: T) extends AnyVal {
  def apply[A <: Version](a: A)(implicit ev: T <:< Request[A]): T = t
}

Что вы можете использовать, как это.

Test.test2(Test.HelloWorld())(Test.VersionOne)
// res: HelloWorld = HelloWorld()
1 голос
/ 13 июня 2019

Nothing в ошибке компиляции обычно означает, что некоторые параметры типа не были выведены.

Попробуйте указать их явно

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

Разница между test1 и test2 нетолько в карри.Например, обычно в test2(t: ...)(a: ...) тип a может зависеть от значения t.Таким образом, для test2 вывод типа сложнее, чем для test1.

Вывод типа Scala и список нескольких аргументов

Вывод типа с псевдонимами типов ифункция списка нескольких параметров

Не определен тип аргумента закрытия нескольких параметров

В чем разница между несколькими списками параметров и несколькими параметрами в списке в Scala?

...