在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"
答案 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 "&"