2010-10-05 15 views
20

मैं निम्नलिखित स्काला वर्ग हैस्काला: curried कंस्ट्रक्टर्स

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

मैं एक curried समारोह के रूप में व्यक्ति निर्माता का उपयोग करना चाहेंगे:

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

यह काम करता है, लेकिन वहाँ के लिए एक और तरीका है इसे पूरा करो? यह दृष्टिकोण थोड़ा कठिन और त्रुटि प्रवण लगता है। मैं कल्पना कर सकता था जैसे Function.curried, लेकिन फिर रचनाकारों के लिए।

उत्तर

20

यह काम करेगा:

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

बस एक त्वरित नोट, यदि आप इसे कॉल करना सुनिश्चित कर सकते हैं तो यह भी 'वैल mkPerson = ...' बना सकता है। इसके अलावा, अगर व्यक्ति एक केस क्लास था तो आप बस '(Person.apply _) का उपयोग कर सकते थे। Curried' –

+0

बहुत बहुत धन्यवाद। यह वास्तव में बहुत अधिक संक्षेप में है। –

8

तो हो सकता है:

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

मैं देखता हूं। यह अभी भी अधिक जटिल है जिसके लिए मैं उम्मीद करता था: मैं हास्केल रचनाकारों के साथ कुछ और सोच रहा था। –

10

इस पार्टी के लिए देर से थोड़ा, लेकिन अगर आप Person बनाने के एक मामले वर्ग:

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

स्काला एक साथी ऑब्जेक्ट उत्पन्न करता है जिसमें Person.apply(String, Int, String) और आपके लिए कुछ अन्य सामान शामिल हैं। तो फिर तुम कर सकते हैं:

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

कौन सा आशुलिपि है के लिए:

(Person.apply _).curried 

यह भी वर मानकों के साथ काम करता है।

संबंधित मुद्दे