2011-09-12 7 views
3

私はこのTupled関数合成

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

がという名前のアクセスメンバーやオブジェクトコンストラクターが1つの引数

が、この作品を取る '等しいません' エラーを与える理由は好奇心が強いです

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

私はそれをしようとすると、私が取得エラーメッセージが_thisです式には 'a - > 'b *' a'型があると予想されましたが、ここには' 'c * 'd'_型があります。 kvbが素敵な答えで書いたことに、より明確に対応しています。なぜあなたは別のメッセージを得ているのか分かりません... –

答えて

3

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

あなたはもちろんバイナリと単項関数を構成するための新しいコンビネータを定義することができます:あなたはあなたの例の代わりに、(>>)でそれを使用することができます

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

その場合には。新しいコンビネータ演算子定義せずに

+0

ああ。 '' ''最初の引数が単項であることを見落としました。その奇妙なエラーメッセージ(私はまだ得ている)は私を捨てていた。ありがとう。 – Daniel

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) 
+0

+1それはすてきなトリックです! – Daniel