Это действительно зависит от того, что среднее значение фундаментальный.
Если вы действительно просят «если есть техническая что остановит всю работу помешало бы реализовать эту функцию», то я бы сказал, что ответ нет. Вы говорите об обесцвечивании, и вы на правильном пути здесь. Все, что нужно сделать, - это в основном сшить несколько разделов на одну единственную функцию, и это может быть сделано как простой шаг предварительной обработки (для этого требуется только синтаксическое знание, нет необходимости в семантическом знании).Но для этого даже иметь смысл, я бы определил несколько правил:
- Функция подписи является обязательным (в Haskell на примере, это будет факультативным, но всегда является необязательным ли вы определяете функцию сразу или в нескольких частях). Мы могли бы попытаться договориться о том, чтобы жить без подписи и попытаться извлечь ее из разных частей, но отсутствие информации о типе быстро зашло бы на нас. Более простой аргумент состоит в том, что, если мы хотим попытаться вывести неявную подпись, мы могли бы также сделать это для всех методов. Но правда в том, что есть очень веские причины иметь явные певцы в scala, и я не могу представить, чтобы это изменить.
- Все части должны быть определены в пределах одного и того же объема. Для начала они должны быть объявлены в том же файле, потому что каждый исходный файл скомпилирован отдельно, и, таким образом, простого препроцессора было бы недостаточно для реализации этой функции. Во-вторых, в конце концов, мы все-таки заканчиваем одним методом, поэтому вполне естественно иметь все части в одном и том же объеме.
- Перегрузки не представляется возможным для таких методов (в противном случае мы должны были бы повторить подпись для каждой части просто так препроцессор знает, какая часть принадлежит к которой перегружать)
- частей добавлены (сшитые) сгенерированной
match
в порядок они объявлены
Так вот как это может выглядеть следующим образом:
def reverse[T](lst: List[T]): List[T] // Exactly like an abstract def (provides the signature)
// .... some unrelated code here...
def reverse(Nil) = Nil
// .... another bit of unrelated code here...
def reverse(x :: xs) = reverse(xs) ++ List(x)
, которые могут быть преобразованы в тривиальном:
def reverse[T](list: List[T]): List[T] = lst match {
case Nil => Nil
case x :: xs => reverse(xs) ++ List(x)
}
// .... some unrelated code here...
// .... another bit of unrelated code here...
Легко видеть, что такое преобразование является очень механическим и может быть сделано только манипулируя источника AST (АСТ произведенный слегка модифицированной грамматике, которая принимает эти новые конструкции), и превращая ее в целевой АСТ (AST, созданный стандартной грамматикой scala). Затем мы можем скомпилировать результат как обычно.
Итак, вы найдете несколько простых правил, которые мы можем реализовать препроцессор, который выполняет всю работу по реализации этой новой функции.
Если по фундаментальной вы спрашиваете «есть что-нибудь, что бы сделать эту функцию из места», то можно утверждать, что это не чувствовать себя очень Scala. Но, кстати, это не приносит столько же внимания. Автор (ы) Scala фактически склонен к тому, чтобы сделать язык более простым (как в менее встроенных функциях, пытаясь переместить некоторые встроенные функции в библиотеки), и добавление нового синтаксиса, который не является более читаемым, идет вразрез с целью упрощения.
Вы не хотите писать это так, так как это довольно неэффективный «обратный». – Ingo
@Ingo это просто пример (и я добавил отказ от достоверности кода), я мог бы написать факториал в качестве примера, и это будет довольно эффективно. Или вы имеете в виду что-то еще? –
Для меня два выглядят почти так же, за исключением того, что Scala требует, чтобы аргументы были аннотированы по типу, что является следствием OOP/Functional cross breed (против Hindley-Milner в SML). Поэтому я не совсем то, что вы хотели бы видеть (кроме изменения синтаксиса Scala, например, 'def' ->' fun', 'Nil' ->' [] ') –