2009-02-10 18 views
12

के साथ F # पाइप प्रतीक का उपयोग करके मैं किसी ऑब्जेक्ट के निर्माण में पाइप ऑपरेटर का उपयोग करने के लिए सही वाक्यविन्यास को समझने की कोशिश कर रहा हूं। वर्तमान में मैं ऑब्जेक्ट बनाने और बस उस पर पाइप करने के लिए एक स्थिर सदस्य का उपयोग कर रहा हूं। सरलीकृत संस्करण यहां दिया गया है।किसी ऑब्जेक्ट कन्स्ट्रक्टर

type Shape = 
    val points : Vector[] 

    new (points) = 
     { points = points; } 

    static member create(points) = 
     Shape(points) 

    static member concat(shapes : Shape list) = 
     shapes 
      |> List.map (fun shape -> shape.points) 
      |> Array.concat 
      |> Shape.create 

मैं आपकी क्या अपेक्षाएं हैं ...

static member concat(shapes : Shape list) = 
     shapes 
      |> List.map (fun shape -> shape.points) 
      |> Array.concat 
      |> (new Shape) 

यह संभव तरह कुछ है? मैं स्थिर सदस्य बनाने के साथ अपने कन्स्ट्रक्टर को दोहरा कर कोड डुप्लिकेट नहीं करना चाहता हूं।

अद्यतन कंस्ट्रक्टर्स एफ # 4.0

एफ # 4.0 सही सिंटैक्स है के रूप में प्रथम श्रेणी कार्य हैं।

static member concat(shapes : Shape list) = 
     shapes 
      |> List.map (fun shape -> shape.points) 
      |> Array.concat 
      |> Shape 

उत्तर

15

वहाँ, जाहिरा तौर पर

(fun args -> new Shape(args)) 
+0

उह, इतना आसान। मैंने कई अलग-अलग वाक्यविन्यासों की कोशिश की और मजाक का उपयोग करने के बारे में भी सोचा नहीं। धन्यवाद महोदय। – gradbot

3

हमेशा वस्तु कंस्ट्रक्टर्स composable नहीं हैं। भेदभाव संघ कंस्ट्रक्टर्स इस समस्या है लगता नहीं है:

> 1 + 1 |> Some;; 
val it : int option = Some 2 

आप पाइपलाइन उपयोग करना चाहते हैं, ब्रायन के जवाब शायद सबसे अच्छा है। इस मामले में, मैं पूरी अभिव्यक्ति को आकार() के साथ लपेटने पर विचार करता हूं।

+0

कूल, स्पष्टीकरण के लिए धन्यवाद। मैं सिर्फ ब्रायन के रास्ते के साथ बस स्थिरता के लिए चिपकने जा रहा हूं। मुझे प्रकारों को पहचानने में आसानी के साथ काम खत्म करना पसंद है। शायद वे भविष्य में इसके लिए समर्थन जोड़ देंगे। – gradbot

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