2010-10-05 6 views
20

Je la classe Scala suivante:Scala: les constructeurs cari

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

Je voudrais utiliser le constructeur Personne en fonction cari:

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

Cela fonctionne, mais est-il une autre façon de accomplir ceci? Cette approche semble un peu fastidieuse et sujette aux erreurs. Je pourrais imaginer quelque chose comme Function.curried, mais ensuite pour les constructeurs.

Répondre

20

Cela fonctionne:

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

Juste une note rapide, si vous êtes sûr de l'appeler, faites-le 'val mkPerson = ...'. En outre, si la personne était une classe de cas, vous pouvez simplement utiliser '(Person.apply _). Curried' –

+0

Merci beaucoup. C'est en effet beaucoup plus concis. –

8

peut être ainsi:

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

Je vois. C'est encore plus complexe que je ne l'avais espéré: je pensais à quelque chose de plus à la manière des constructeurs Haskell. –

10

Un peu tard pour ce parti, mais si vous faites Person une classe de cas:

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

Scala génère un objet compagnon contenant Person.apply(String, Int, String) et d'autres éléments pour vous. Ensuite, vous pouvez le faire:

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

Ce qui est un raccourci pour:

(Person.apply _).curried 

Il fonctionne avec des paramètres var aussi.

Questions connexes