F#:String.Join和|>操作者

时间:2010-11-25 15:19:31

标签: f# f#-interactive

在F#interactive中,我可以成功使用String.Join("+", ["a"; "b"]),但

["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"

相同

2 个答案:

答案 0 :(得分:56)

String.Join是一种.NET方法。使用.NET方法时,F#将其视为将元组作为参数的函数(在调用它时,您将参数写为f(a, b))。 |>运算符可以与使用 curried form 参数的函数一起使用(可以通过编写f a b来调用)。

您可以使用F#库中的函数String.concat(它做同样的事情):

["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#的编程风格(没有流水线操作),因为管道只适用于函数库。

答案 1 :(得分:15)

我以为我会选择另一种方法。 OP专门询问了String.Join,Tomas Petricek的回答对于该方法是完全正确的(使用F#库中的String.concat)。

如果你在谈论另一种采用tupled参数的方法,但你想将它们用作curried,你可以使用这个辅助函数:

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

这允许您将方法传递给'partial'并返回curried函数。像这样使用它:

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