2010-10-05 20 views
20

Tengo el siguiente clase Scala:Scala: constructores curry

class Person(var name : String, var age : Int, var email : String) 

me gustaría utilizar el constructor persona en función al curry:

def mkPerson = (n : String) => (a : Int) => (e : String) => new Person(n,a,e) 

Esto funciona, pero ¿hay otra forma de lograr esto? Este enfoque parece un poco tedioso y propenso a errores. Podría imaginar algo como Function.curried, pero luego para los constructores.

Respuesta

20

esto funcionará:

def mkPerson = (new Person(_, _, _)).curried 
+2

Solo una nota rápida, si está seguro de llamarlo también puede hacerlo 'val mkPerson = ...'. Además, si Persona fuera una clase de caso, simplemente podría usar '(Person.apply _). Curried' –

+0

Muchas gracias. Esto es de hecho mucho más conciso. –

8

puede ser tan:

val mkPerson = Function.curried((n: String,a:Int,e:String) => new Person (n,a,e))
+0

Ya veo. Todavía es más complejo de lo que esperaba: estaba pensando en algo más parecido a los constructores de Haskell. –

10

un poco tarde a la fiesta, pero si haces Person una clase de caso:

scala> case class Person(name: String, age: Int, email: String) 
defined class Person 

Scala genera un objeto complementario que contiene Person.apply(String, Int, String) y algunas otras cosas para usted. A continuación, puede hacer:

scala> Person.curried 
res5: String => (Int => (String => Person)) = <function1> 

Cuál es la abreviatura de:

(Person.apply _).curried 

Se trabaja con parámetros var también.

Cuestiones relacionadas