2009-05-02 13 views
14

मैं एफ # में इस (सी #) करना कैसे होगाf # में multiline lambda अभिव्यक्तियों को कैसे करें?

public class MyClass 
{ 
    void Render(TextWriter textWriter) 
    { 
     Tag(() => 
       { 
        textWriter.WriteLine("line 1"); 
        textWriter.WriteLine("line 2"); 
       }); 
     Tag(value => 
       { 
        textWriter.WriteLine("line 1"); 
        textWriter.WriteLine(value); 
       }, "a"); 
    } 

    public void Tag(Action action) 
    { 
     action(); 
    } 
    public void Tag<T>(Action<T> action, T t) 
    { 
    action(t); 
    } 
} 

उत्तर

23

एफ # में एक बहु लाइन लैम्ब्डा सिर्फ

(fun args -> 
    lots 
    of 
    code 
    here 
) 

है की तरह कुछ

open System.IO 

type MyClass() as this = 
    let Render(tw : TextWriter) = 
     this.Tag(fun() -> 
      tw.WriteLine("line1") 
      tw.WriteLine("line2") 
     ) 
     this.Tag(fun(value : string) -> 
      tw.WriteLine("line1") 
      tw.WriteLine(value) 
     , "a" 
     ) 
    member this.Tag(action) = 
     action() 
    member this.Tag(action, x) = 
     action(x) 

संभालने पूरे कोड होगा मैंने कोई ट्रांसक्रिप्शन त्रुटियां नहीं कीं। (मैंने सार्वजनिक इंटरफेस में एक्शन प्रतिनिधियों की बजाय एफ # फ़ंक्शन प्रकारों का उपयोग किया।)

+2

कूल, लेकिन उसके उदाहरण में सी # कोड एफ # में कैसे दिखता है? – ichiban

+0

सही उत्तर। – Simon

5

यदि आप करना चाहते हैं तो बहु-लाइन लैम्ब्डा लिखना है, तो आप अर्ध-कोलन ऑपरेटर को ब्रांड्स के अंदर एक साथ कथन कर सकते हैं। उदाहरण:

(fun() -> (write_line "line 1" ; write_line "line 2")) 

और

(fun val -> (write_line "line 1" ; write_line val)) 

हालांकि दूसरे उदाहरण मैं दे दी है तभी काम करता है वैल के प्रकार स्ट्रिंग है।

चेतावनी: मुझे एफ # के विवरण नहीं पता हैं। मैं इसे एक उद्देश्य कैमल पृष्ठभूमि से लिख रहा हूं। भाषाएं बहुत समान हैं, लेकिन कुछ अंतर हो सकते हैं जो मेरे सुझाव को थोड़ा गलत बनाते हैं। इसके अलावा, मैं अब एक ओकंपल या एफ # दुभाषिया वाली मशीन पर नहीं हूं इसलिए मैं यह सुनिश्चित करने के लिए इन स्निपेट को नहीं देख सकता कि वे काम करते हैं।

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