なぜこれが気になる
let f = (fun a b -> a, b) >> obj.Equals
エラーを与える
'Equals' という名前のアクセス可能なメンバーまたはオブジェクト コンストラクターは 1 つの引数を取らない
しかし、これは機能します
let f = (fun a -> a, a) >> obj.Equals
なぜこれが気になる
let f = (fun a b -> a, b) >> obj.Equals
エラーを与える
'Equals' という名前のアクセス可能なメンバーまたはオブジェクト コンストラクターは 1 つの引数を取らない
しかし、これは機能します
let f = (fun a -> a, a) >> obj.Equals
新しいコンビネータ演算子を定義しない場合:
let f = (fun a b -> a, b) >> (<<) obj.Equals
>> (<<)
は素晴らしいトリックであり、より多くの引数に拡張することもできます:
let compose3 f g = f >> (<<) ((<<) g)
val compose3 : ('a -> 'b -> 'c -> 'd) -> ('d -> 'e) -> ('a -> 'b -> 'c -> 'e)
タイプを検討してください。 (>>)
はタイプを持っていますが、タイプと('a -> 'b) ->('b -> 'c) -> ('a -> 'c)
の引数を使用してそれを呼び出そうとしています。これは、そのように組み合わせることができません。'a -> ('b -> 'a*'b)
obj * obj -> bool
もちろん、2進関数と単項関数を作成するための新しいコンビネータを定義することもできます。
let ( >>* ) f g a b = f a b |> g
この場合、例ではの代わりに使用できます(>>)
。