que estaba bajo la impresión de que estefunciones al curry imperiosa de Scala
// short syntax
def foo(bar: Bar)(baz: Baz): Quux
era el azúcar sintaxis de este
// long syntax
def foo(bar: Bar): (Baz) => Quux
Pero me parece que no puede mezclar los dos en lo que respecta a la herencia. El árbol completo tiene que definirse en la sintaxis corta o en la sintaxis larga; nunca ambos.
Por ejemplo:
case class Context
case class Work
trait ContextualWorker {
def workWithContext(ctxt: Context)(work: Work): Traversable[Work]
}
class ShortConcreteWorker extends ContextualWorker {
override def workWithContext(ctxt: Context)(work: Work) = Nil
}
class LongConcreteWorker extends ContextualWorker {
// error on next line: method workWithContext overrides nothing <-------------
override def workWithContext(ctxt: Context): (Work) => Traversable[Work] = {
val setupCode = 1
{ work => Nil }
}
}
Si cambio el rasgo de usar la sintaxis de largo, entonces ShortConcreteWorker no compila.
¿Hay alguna razón por la cual estos no sean intercambiables/heredables? ¿Cómo lo has conseguido?
En este momento el enfoque más flexible parece ser definir el árbol en la sintaxis de largo, tal vez de delegar a una clase de implementación en ShortConcreteWorker así:
case class Context
case class Work
trait ContextualWorker {
def workWithContext(ctxt: Context): (Work) => Traversable[Work]
}
class ShortConcreteWorker extends ContextualWorker {
override def workWithContext(ctxt: Context) = workWithContextImpl(ctxt)_
private def workWithContextImpl(ctxt: Context)(work: Work) = Nil
}
class LongConcreteWorker extends ContextualWorker {
override def workWithContext(ctxt: Context): (Work) => Traversable[Work] = {
val setupCode = 1
{ work => Nil }
}
}
Supongo que está basando su suposición en [esta página en el sitio de Scala] (http://www.scala-lang.org/node/135). Desafortunadamente no es del todo exacto, consulte la sección 3.3.1 de la especificación de Scala. – rxg