2012-04-30 26 views
2

如何寫一個F#方法等於下面的C#代碼?試圖谷歌它,但無法找到任何工作的。謝謝。如何聲明一個元組列表作爲參數的f#方法?

public List<Tuple<long, string, string>> Fun(List<Tuple<long, string>> param) 
{ 
    var ret = new List<Tuple<long, string, string>>(); 

    foreach (var tuple in param) 
    { 
    ret.Add(new Tuple<long, string, string>(tuple.Item1, tuple.Item2, "new val")); 
    } 

    return ret; 
} 

回答

6

如果你想使用慣用的功能列表,那麼你可以這樣寫:

let func (param:(int64 * string) list) = 
    [ for n, s in param -> n, s, "new val" ] 

我加了註釋(int64 * string) list以確保你得到同樣類型的一個在C# 。如果你沒有添加它,那麼F#編譯器會推斷該函數是通用的 - 因爲它實際上並不關心元組前兩個元素的類型。註釋也可以使用param:list<int64 * string>以C#風格的符號寫入,這可能更易於閱讀。

如果你想使用.NET List型(通常不是在F#推薦),可以使用F#別名ResizeArray寫:

let func (param:(int64 * string) ResizeArray) = 
    ResizeArray [ for n, s in param -> n, s, "new val" ] 

這將創建一個F#列表,然後將其轉換爲.NET List<T>類型。這應該給你與C#版本完全相同的公共IL簽名,但我會推薦使用F#特定類型。

作爲一個附註,第二個例子可以使用命令性的F#代碼來實現(使用for來迭代元素,就像在C#中一樣)。這產生與C#完全相同的IL,但如果您稍後需要優化某些F#代碼,則此功能非常有用。所以我不建議這個版本(這也更長:-)):

let func (param:(int64 * string) ResizeArray) = 
    let res = new ResizeArray<_>() 
    for n, s in param do 
    res.Add(n, s, "new val") 
    res 

你也可以使用更高階的功能,如List.map寫:

let func (param:(int64 * string) list) = 
    params |> List.map (fun (n, s) -> n, s, "new val") 
2

這裏是一個直譯:

member __.Fun (param:ResizeArray<int64 * string>) = 
    ResizeArray(param |> Seq.map (fun (a, b) -> a, b, "new val")) 

這是不是很地道,但是。

相關問題