3

MicrosoftのF#サンプルでは、​​次のように「>>」演算子を使用しています。

test |> Seq.iter (any_to_string >> printfn "line %s");

このコンテキストで「>>」演算子は何をしますか?シーケンスの各アイテム(この場合は配列)はany_to_string暗黙的に渡されますか?これは似てい(fun item -> printfn "line %A" item)ますか?

4

6 に答える 6

8

(>>)は、2つの関数(互換性のある引数を持つ)を取り、それらを1つの関数に結合(「構成」)する高階関数です。

たとえば、

let len (s : string) = s.Length
let show (n : int) = n.ToString()

この線

(show >> len) 15

と同等です

len (show 15)

と同様

show 15 |> len
于 2009-05-13T17:01:25.703 に答える
5

での定義

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Core.Operators.html

言う

val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first

しかし、他の人がより詳細な説明を提供してくれることを願っています。

編集

今すぐMSDNドキュメント

http://msdn.microsoft.com/en-us/library/ee353825(VS.100).aspx

于 2009-05-13T16:53:47.603 に答える
5

同等のコードは次のように書くことができます。


test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))

言い換えると、>>演算子は単純にこれを行います。関数f(x)がタイプTを返し、g(y)がタイプTである場合、f >> gを使用して関数h(z)を作成できます。 g(f(x))と同等です。引数はありませんが、内部関数と外部関数をその演算子に渡す必要があります。その結果、コード内でいつでも適用できる関数になるため、次のように実行できます。


//myFunc accepts any object, calls its ToString method, passes ToString
//result to the lambda which returns the string length. no argument is
//specified in advance
let myFunc = any_to_string >> (fun s -> s.Length)
let test = 12345
let f = 12345.0
//now we can call myFunc just like if we had definied it this way:
//let myFunc (x:obj) = obj.ToString().Length
printfn "%i" (myFunc i)
printfn "%i" (myFunc f)
于 2009-05-13T16:59:41.807 に答える
3

これは関数合成演算子です(他の投稿で説明されています)

彼のセマンティクスを確認するために、この演算子を自分で定義できます。

let (>>) f g = fun x -> g (f x)
于 2009-05-13T17:06:55.603 に答える
3

C#、ジェネリック、またはラムダに不安がある場合、これはまったく役に立たない可能性がありますが、C#の同等のものは次のとおりです。

//Takes two functions, returns composed one
public static Func<T1, T2> Compose<T1, T2, T3>(this Func<T1, T2> f, Func<T2, T3> g)
{
    return (x) => g(f(x));
}

タイプパラメータを見ると、ブライアンの答えのようなものがわかります。

Composeは、T1からT2に移動する関数と、T2からT3に移動する関数を受け取り、T1からT3に移動する2つの関数の組み合わせを返します。

于 2009-05-14T08:05:26.330 に答える
2

オペレーターは関数の合成を実行します。これはウィキペディアで>>非常によく説明されています。ダスティンキャンベルはそれの素晴らしい使用法を提供し、彼のブログでそれを( (フォワードパイプ)オペレーターと一緒に)説明しています。|>

于 2009-05-13T16:59:14.583 に答える