Я пытаюсь реализовать/переопределить функцию с пустым аргументом ввода с помощью частичной функции. Это лучше всего объяснить этим нерабочую минимальный пример:Scala Currying: функция переопределения с пустым аргументом частичной функцией
trait T
trait TFactory {
def build(): T
}
class A(someParameter: Int) extends T
object A extends TFactory {
def build(someParameter: Int)(): T = new A(someParameter)
}
Компилятор жалуется: object creation impossible, since method build in trait TFactory of type()T is not defined
, что имеет смысл, поскольку тип сборки является (Int)()T
. Моя следующая идея состояла в том, чтобы сделать тип build
явно функцию с пустым аргументом и возвращает T
, т.е .:
trait T
trait TFactory {
def build:() => T // what about empty parenthesis after build?
}
class A(someParameter: Int) extends T
object A extends TFactory {
def build(someParameter: Int): (() => T) = (() => new A(someParameter))
}
Теперь очевидно, что тип build
является () => T
. К моему удивлению, компилятор теперь жалуется на object creation impossible, since method build in trait TFactory of type =>() => T is not defined
(обратите внимание, что тип внезапно начинается с =>
). Отчаянное добавление пустой скобки в конце определения функции не помогает.
Как я могу убедить мой компилятор, что эти типы на самом деле одинаковы?
Разъяснение:
Моя главная цель состоит в том, чтобы достичь параметров свободной инициализации T
без необходимости завода для заводов. Пример:
val t = A(33).build() // if this is possible, I though it might be possible to have:
val t = A.build(33)()
Вывод:
Я думаю, что это просто невозможно, потому что абстрактная функция просто определяет, сколько аргументов блокирует функцию build
должны принять. Другими словами: вы не можете реализовать абстрактную функцию с помощью функции, у которой частичное приложение имеет ту же подпись, что и функция, которую вы пытаетесь реализовать.
Я не уверен, что я следую. TFactory обещает предоставить метод «build», который не принимает никаких параметров и возвращает либо T (в первом примере), либо функцию, возвращающую T (во втором). Но такой объект не определен в объекте A. –
Предполагаемое поведение 'build' заключается в том, чтобы ничего не принимать в качестве входных данных и возвращать новый экземпляр' T'. Цель реализации в объекте A заключается в том, чтобы просто обернуть все необходимые параметры 'A', позволяющие инициализировать« без параметров ». – bluenote10