2009-05-02 68 views
14

我將如何做到這一點(C#)在F#如何在f#中執行多行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

在F#多行拉姆達只是

(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) 

假設我沒有發現抄寫錯誤。 (我在公共接口中使用了F#函數類型而不是Action代理)。

+2

很酷,但他的例子中的C#代碼在F#中看起來如何? – ichiban 2009-05-02 06:39:54

5

如果您只想編寫多行lambda表達式,則可以使用括號內的分號運算符將多個語句串起來。例如:

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

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

雖然我給了第二個例子如果val的類型爲字符串纔有效。

警告:我不知道F#的詳細信息。我從Objective Caml背景寫這篇文章。語言非常相似,但可能會有一些差異,這使我的建議略有不妥。此外,我現在不在帶有ocaml或F#解釋器的機器上,因此我無法檢查這些片段以確保它們正常工作。

相關問題