2010-11-25 9 views
25

インタラクティブは、私が正常にString.Join("+", ["a"; "b"])を使用することができますが、F番号:String.Joinと| F#では>演算子

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

がエラーを生成します。

私が使用してコレクションを渡す String.Joinを使用するにはどうすればよい
Script1.fsx(79,15): error FS0001: This expression was expected to have type 
    string list -> 'a  
but here has type 
    string 

パイプライン?

P.S.同じ問題がありますlines |> File.WriteAllLines "filename.txt"

答えて

43

String.Joinは.NETメソッドです。 .NETメソッドを使用する場合、F#はそれを引数としてタプルをとる関数として表示します(呼び出すときはパラメータをf(a, b)として記述します)。 |>演算子は、のカレット形式ののパラメータを使用する関数で使用できます(f a bと書くことができます)。

あなたが代わりに(同じことを)F#のライブラリから機能String.concatを使用することができます。

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

EDITをFile.WriteAllLinesは同じケースです。あなたは上のすべての引数を書きたい場合にのみ、あなたは、.NETメソッドを持つ|>を使用することができ、一般的には

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

:あなたは、パイプラインの一部としてそれを使用する場合は、呼び出しをラップF#関数を書くことができますオペレータの左側。たとえば、次のように書くことができます。

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

...しかし、これはパイプライン演算子の通常の使用には適合しません。 .NET APIを使用する場合、パイプラインは機能ライブラリだけでうまく機能するため、通常はC#のようなプログラミングスタイル(パイプラインなし)を使用する方がよいでしょう。

+0

ありがとうございます!ちなみに、 'File.WriteAllLines'はどんな運がありますか? –

+0

または... .Netメソッドは '|>'では動作しませんか? –

+0

@modosansreves:私はあなたの他の質問に答えを加えました。 –

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 "&" 
関連する問題