F#インタラクティブでは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
パイプラインを使用してコレクションを渡すにはどうすればよいですか?
PS同じ問題はlines |> File.WriteAllLines "filename.txt"
ベストアンサー1
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# のようなプログラミング スタイル (パイプラインなし) を使用する方が適切です。