2010-11-25 66 views
25

在F#互動,我可以使用String.Join("+", ["a"; "b"])成功,但F#:的string.join和|>運營商

["a"; "b"] |> String.Join "+" 

產生一個錯誤:

Script1.fsx(79,15): error FS0001: This expression was expected to have type 
    string list -> 'a  
but here has type 
    string 

如何使用String.Join通過使用集合管道?

P.S.同樣的問題與lines |> File.WriteAllLines "filename.txt"

回答

43

String.Join是一種.NET方法。當使用.NET方法時,F#將其視爲一個將元組作爲參數的函數(當調用它時,您將參數寫爲f(a, b))。 |>操作員可以與使用參數的咖啡形式(並且可以通過編寫f a b調用)的功能一起使用。

您可以使用函數String.concat從F#庫(它做同樣的事情),而不是:

["a"; "b"] |> String.concat "+" 

編輯File.WriteAllLines是一樣的情況。如果你想用它作爲管道的一部分,你可以寫一個包裝調用的F#功能:

let writeAllLines file (lines:seq<string>) = 
    System.IO.File.WriteAllLines(file, lines) 

在一般情況下,你可以使用|>與.NET方法只有當你想在寫的所有參數操作員的左側。你可以例如寫:

("+", ["a"; "b"]) |> System.String.Join 

...但這不符合通常使用管道運營商。在使用.NET API時,通常最好使用類似C#的編程風格(不使用流水線),因爲流水線只適用於函數庫。

+0

謝謝!順便說一句,有`File.WriteAllLines`的運氣? – 2010-11-25 15:39:42

10

我想我會選擇一個替代方案。 OP特別詢問了有關String.Join的內容,Tomas Petricek的答案對於該方法是絕對正確的(使用F#庫中的String.concat)。

如果你談論的是需要tupled參數的另一種方法,但要使用他們作爲咖喱,你可以使用這個輔助函數:

let partial f x y = f(x, y) 

這使您可以通過一種方法來「部分」並獲得一個咖喱功能。像這樣使用它:

let partial f x y = f(x, y) 
myCollection |> partial String.Join "&"