2010-10-05 14 views
20

Aşağıdaki Scala sınıfı adres:Scala: curried kurucular

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

ben curried fonksiyonu olarak Kişi yapıcı kullanmak istiyorum: Bu işler

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

ama başka bir yolu yoktur Bunu başarmak? Bu yaklaşım biraz sıkıcı ve hataya eğilimli görünüyor. Function.curried gibi bir şey hayal edebiliyorum, ama sonra kurucular için.

cevap

20

Bu çalışacaktır:

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

Sadece hızlı bir not, eğer buna mutlaka eminseniz de bunu yapabiliriz: mkPerson = ... '. Ayrıca, Kişi bir vaka sınıfı olsaydı, basitçe '(Person.apply _) kullanabilirsiniz. Curried' –

+0

Çok teşekkürler. Bu gerçekten çok daha özlü. –

8

yüzden olabilir:

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

Görüyorum. Hala umduğumdan daha karmaşık: Haskell kurucularının çizgileri boyunca daha çok şey düşünüyordum. –

10

bu partiye biraz geç, ancak bir vaka sınıf Person yaparsanız:

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

Scala Person.apply(String, Int, String) ve sizin için başka şeyler içeren bir tamamlayıcı nesne oluşturur. Sonra yapabilirsiniz: Çok var parametreleri ile çalışır

(Person.apply _).curried 

: için kısaltmadır

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

hangisi.