3

なぜこれが気になる

let f = (fun a b -> a, b) >> obj.Equals

エラーを与える

'Equals' という名前のアクセス可能なメンバーまたはオブジェクト コンストラクターは 1 つの引数を取らない

しかし、これは機能します

let f = (fun a -> a, a) >> obj.Equals
4

2 に答える 2

6

新しいコンビネータ演算子を定義しない場合:

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)
于 2011-09-13T05:07:57.493 に答える
3

タイプを検討してください。 (>>)はタイプを持っていますが、タイプと('a -> 'b) ->('b -> 'c) -> ('a -> 'c)の引数を使用してそれを呼び出そうとしています。これは、そのように組み合わせることができません。'a -> ('b -> 'a*'b)obj * obj -> bool

もちろん、2進関数と単項関数を作成するための新しいコンビネータを定義することもできます。

let ( >>* ) f g a b = f a b |> g

この場合、例ではの代わりに使用できます(>>)

于 2011-09-12T22:51:08.913 に答える