2

<<構成演算子は、同じ型を取り込んで返す 2 つの関数を使用することを理解しています。例えば (lhs:'a -> 'a) -> (rhs:'a -> 'a) -> 'a

(lhs:'a -> 'b) -> (rhs:'c -> 'b) -> 'b副作用に興味があり、戻り値 'b がおそらくユニット型ではない場合のようなものが欲しいと思うことがよくあります。これは、データベースに何かを保持している 2 つの行が連続している場合にのみ発生します。

次のようなものを書かずにこれを行う組み込み関数または慣用的な F# の方法はありますか

let myCompose lhs rhs arg =
    lhs arg
    rhs arg
4

3 に答える 3

4

合成演算子または逆合成演算子(<<)、同じ型を取り、同じ型を返す 2 つの関数を取りません。唯一の制約は、適用される最初の関数の出力型が、それが合成される関数の入力型と同じでなければならないということです。MSDN によると、関数のシグネチャは次のとおりです。

// Signature:
( << ) : ('T2 -> 'T3) -> ('T1 -> 'T2) -> 'T1 -> 'T3

// Usage:
func2 << func1

あなたが望むように動作する組み込みの合成演算子については知りませんが、このパターンがコードで頻繁に使用されるものであり、そのような演算子を使用するとコードが簡素化される場合は、独自に定義するのが合理的だと思います。例えば:

> let (<<!) func2 func1 arg = func1 arg; func2 arg;;

val ( <<! ) : func2:('a -> 'b) -> func1:('a -> unit) -> arg:'a -> 'b

または、両方の関数が を返すことがわかっている場合はunit、次のように記述して、出力型を に制限することができますunit

> let (<<!) func2 func1 arg = func1 arg; func2 arg; ();;

val ( <<! ) : func2:('a -> unit) -> func1:('a -> unit) -> arg:'a -> unit
于 2013-06-14T14:18:49.170 に答える