2010-11-25 68 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 "&"