2010-10-05 8 views
20

Ich habe die folgende Scala Klasse:Scala: curried Bauer

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

Ich möchte die Person Konstruktor als curried Funktion verwenden:

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

Dies funktioniert, aber ist es eine andere Art und Weise zu dies erreichen? Dieser Ansatz erscheint ein wenig mühsam und fehleranfällig. Ich könnte mir etwas wie Function.curried vorstellen, aber dann für Konstrukteure.

Antwort

20

Diese Arbeit wird:

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

Nur eine kurze Notiz, wenn Sie sicher sind, dass Sie es anrufen, können Sie es auch 'val mkPerson = ...' machen. Auch wenn die Person eine Fallklasse wäre, könnte man einfach '(Person.apply _). Curried' verwenden. –

+0

Vielen Dank. Dies ist in der Tat viel prägnanter. –

8

kann so sein:

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

Ich sehe. Es ist immer noch komplexer, als ich es mir erhofft hatte: Ich dachte an etwas, das mehr an die Konstrukteure von Haskell erinnert. –

10

Ein bisschen spät zu dieser Party, aber wenn Sie machen Person einen Fall Klasse:

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

Scala erzeugt ein Companion-Objekt, das Person.apply(String, Int, String) und einige andere Sachen für Sie enthält. Dann können Sie tun:

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

Welche Stenografie ist für:

(Person.apply _).curried 

Es mit var Parameter funktioniert auch.

Verwandte Themen