2013-02-18 6 views
6

Angenommen, ich habe zwei Funktionen, f:X->Y und g:Y*Y->Z. Ich möchte eine dritte Funktion machen, h(a, b) = g(f(a), f(b)).Verketten Multi-Parameter-Funktionen

h a b = g (f a) (f b) 

Gibt es eine Möglichkeit, es wie h(a, b) = g*f (a, b) zu schreiben?

Und was ist, wenn h(a,b,c,d) = g2*g1*f2*f1 (a,b,c,d), wo g_i 2 Args dauert?

+0

Ihre zwei Beispiele nicht synchron sind. Der erste sollte 'g (f1 a) (f2 b)' oder der zweite 'g (f a) (f b) (f c) (f d)' sein. –

+0

Sie können 'h = \ a b -> g (f a) (f b)' als 'h = (. F) schreiben. g. f, aber du solltest nicht (Lesbarkeit). –

+0

in Ihrem neuen 2. Beispiel meinen Sie 'f' Funktionen, die' arg nehmen, und 'g'Funcs nehmen 2? Dann brauchst du eine 3. Stufe. Könntest du es genau ausschreiben? –

Antwort

10

Die Suche nach Hoogle nach Funktionen mit der right signature zeigt on von Data.Function. Entsprechend seiner Dokumentation,

g `on` f 

scheint zu sein, was Sie wollen.

7

Die on combinator (in Data.Function, wie GSPR in eine andere Antwort darauf hingewiesen) durch

g `on` f = \x y -> g (f x) (f y) 

definiert, die Sie

h = g `on` f 

Sie höherdimensionalen Verallgemeinerungen machen können, schreiben würde es ermöglichen davon beispielsweise

g `on3` f = \x y z -> g (f x) (f y) (f z) 

g `on4` f = \w x y z -> g (f w) (f x) (f y) (f z) 

Damit könnten Sie schreiben

h = g `on3` f 

Es kann ein Weg sein, on3 und on4 in Bezug auf on zu schreiben, aber wenn es ist, kann ich es zur Zeit nicht sehen.

6

Sie finden vielleicht auch Pfeile interessant. Hier ist eine Möglichkeit, es zu tun:

h g f a b = uncurry g ((f *** f) (a, b)) 

die zu Ihrem Beispiel entspricht (außer, dass g und f nicht frei sind) und on.Mit:

  • definition von *** für Funktionen:

    (***) f g ~(x,y) = (f x, g y) 
    
  • definition von uncurry:

    uncurry f p = f (fst p) (snd p) 
    

und sie in die ursprüngliche Gleichung ersetzt:

  1. h g f a b = uncurry g (f a, f b)(verwendet *** Definition)

  2. h g f a b = g (f a) (f b)(verwendet uncurry Definition)