2009-05-02 21 views
14

Ben F # Bu (C#) yapacağını nasılÇok satırlı lambda ifadeleri f # nasıl yapılır?

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); 
    } 
} 

cevap

23

F # Bir çok satırlı lambda sadece

(fun args -> 
    lots 
    of 
    code 
    here 
) 

olduğunu varsayarak bir şey

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) 

gibi bütün kod olurdu Yazım hatası yapmadım. (Genel arabirimde Action delegeleri yerine F # işlev türlerini kullandım.)

+2

Serin, ama örnekte C# kodu F # olarak nasıl görünüyor? – ichiban

+0

mükemmel cevap. – Simon

5

Tek yapmanız gereken çok satırlı lambda yazmaksa, parantez içinde yarı kolon operatörünü kullanarak birkaç deyimi bir araya getirebilirsiniz. Örnek:

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

ve

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

val tip dizesi olup olmadığını verdi İkinci örnek çalışır rağmen

.

Uyarı: F # 'nin özelliklerini bilmiyorum. Bunu Objective Caml arkaplanından yazıyorum. Diller çok benzer, ancak önerimi biraz yanlış yapan bazı farklılıklar olabilir. Ayrıca, şimdi bir ocaml veya F # yorumlayıcısına sahip bir makinede değilim, bu yüzden bu snippet'leri çalıştıklarından emin olmak için kontrol edemiyorum.