2013-09-28 5 views
9

関数の合成に関与する共通のパターン( B - > F(グラムA)(グラムb)参照)

f :. g = \a b -> f (g a) (g b) 

のように見えfとgの組成は、私は私のコードで非常に頻繁に見つけるパターンです。これは単項関数の構成と似ていますが、 fはバイナリで、 fに渡される前に両方の引数に gを適用します。

私はこの時点フリーをするためのフォームを変換するlambdabotを頼むとき、私は奇妙な呪文私はむしろ私のコードではありませ思いますので、私は明示的にパターンを書き出す終わる

を取得。

このような状況でコンビネータを書くには、一般に認められた方法がありますか?またはこの状況で自分自身を見つけるのは奇妙ですか?

私はそれが必要なときにここで尋ねることは考えたことがないので、私はこれを手にして実際の例はありませんが、それと非常にきれいにユークリッド距離の公式を書くことが想像できるでしょう。そのよう:

distance = sqrt . (+) :. (^2) 
+2

(:.) :: (b -> b -> c) -> (a -> b) -> (a -> a -> c) infixr 9 (:.) f :. g x y = f (g x) (g y) 
を 'flip'を排除することができる:(G)'。 f。 g ' –

答えて

24

この機能はData.Functionモジュールにonと呼ばれています。

sqrt . (+) `on` (^2)のように、よく使われます。

+2

私はこれを考えなかったと信じられない!本当にありがとう。 – kqr

+0

一般的な使用例は 'sortBy(compare \' abs \) 'です。 –

+0

将来のGoogleの人には注意しますが、 'abs abs'は' 'abs''を比較するよりも慣用的です。これは 'comparison = on compare'が標準ライブラリのどこかで定義されているために働きます。 – kqr

2

ポイントフリースタイルで書き込もうとしないでください。これは、ポイントフリーがしばしば読みにくいという事実の例です。

だけthuslyそれを定義:

+0

ここでは、inix演算子は疑問です。特に、 '(。)に':.'や '。:'を使う人が多いので疑問です。 (。) ' – jozefg

+0

@jozefgメッセンジャーを撃ってはいけません - それはOPが質問で使ったシンボルです。 –

+0

@jozefg私は故意にowl演算子によく使われる '。:'と並行して ':.'を意図的に選択しました。 '。:'は左の1つの引数(したがってドット)と右の2つの引数の関数(したがって二重のドット)の関数をとるので、 '::'と見なすので、 ':.'は2つの引数右は1つの引数の関数です。 – kqr

関連する問題