«Отсутствует тип параметра» в перегруженном универсальном методе, принимающем аргумент функции - PullRequest
7 голосов
/ 23 июня 2011

У меня возникла проблема в моем DSL с перегруженными обобщенными методами, в результате чего компилятор попросил меня добавить явные типы параметров:

def alpha[T](fun: Int => T): String = fun(33).toString

def beta [T](fun: Int => T): String = fun(66).toString
def beta [T](thunk:   => T): String = thunk.toString

alpha { _ + 11 }          // ok
beta { _ + 22 }           // "error: missing parameter type for expanded function"
beta { _: Int => _ + 22 } // ok... ouch.

Есть ли шанс, что я смогу избавиться от беспорядка в последней строке?

EDIT:

Чтобы продемонстрировать, что перегрузка не является проблемой неоднозначности для скаляров как таковых, вот версия без параметра типа, которая прекрасно работает:

def beta(fun: Int => String): String = fun(66).reverse
def beta(thunk:   => String): String = thunk.reverse

beta(_.toString)  // ok
beta("gaga")      // ok

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

Проблема в том, что Int => T также является типом. Например, скажем, вы определили только второй beta:

def beta[ T ]( thunk: => T ) : String = thunk.toString

А теперь вы передаете ей функцию Int => Int:

scala> beta((_: Int) + 1)
res0: String = <function1>

Итак, учитывая, что функция соответствует => T, и что у вас также есть Int => T, как Scala должна знать, какую именно вы хотите? Это может быть String, например:

scala> beta((_: String) + 11)
res1: String = <function1>

Как мог Скала предположить, что это был Int? Примеры, которые вы показали, чтобы продемонстрировать перегрузку, не виноваты, не демонстрируют ничего подобного, потому что вы избавились от параметров типа в них.

1 голос
/ 23 июня 2011

Как вы могли догадаться, проблема возникает из-за того, что у вас бета-функция перегружена.Когда вы определяете:

beta { _ + 22 }

Какую бета-версию вы ожидаете сделать?Scala не может знать, что _ является Int только потому, что вы суммируете его с 22. Поэтому для этого конкретного примера вы должны определить, что такое _.

...