Wie funktioniert die Funktionszusammensetzung für 'foo (bar x) (bar y)' in Haskell?

7

Ich weiß, dass es in Haskell eine tolle Funktion namens Funktionszusammensetzung gibt, damit wir unseren Haskell Code pithier machen können, wie:

  • Verwenden Sie (f . g) x anstelle von f (g x) ,
  • benutze foo x $ bar y z anstelle von foo x (bar y z)

Aber ist es möglich, dass wir die Funktionszusammensetzung für foo (bar x) (bar y) verwenden könnten?

    
Jasin Yip 18.05.2016, 03:26
quelle

5 Antworten

13

Sie können hierfür die Funktion on verwenden, zum Beispiel

%Vor%     
jamshidh 18.05.2016 03:40
quelle
4

Definiere es selbst! Nur eine neue Infix-Funktion:

%Vor%

Dann in ghci:

%Vor%     
ilyavf 18.05.2016 05:15
quelle
2
  

ist es möglich, dass wir die Funktionszusammensetzung für foo (bar x) (bar y)

verwenden könnten

@ilyavf hat eine Antwort für eine Funktionsdefinition gegeben, so dass (foo $.$ bar) x y wie foo (bar x) (bar y) wirkt. Und @jamshidh bietet an, dass es als on in Data.Function existiert.

Beachten Sie jedoch die Typensignatur einer bestimmten Form:

%Vor%

Als eine Funktion ist es jedoch "lustig" aufgrund einer Annahme, die es zu machen hat. Diese Annahme ist, dass beide Argumente von foo vom selben Typ sind. (Wie könnte es sonst richtig sein, das Ergebnis von bar für beide zu verwenden?)

Die "angenehmere Form", in die Haskell gravitiert, führt nicht zum Sonderfall der Arbeit mit Funktionen, die zwei Argumente desselben Typs haben. Denn was ist das Besondere an 2? Viel interessanter ist "N", und wenn Ihre Funktion N Argumente des gleichen Typs annimmt, dann ist eine Liste schöner ... und kann beliebig mit einer Kartenoperation zusammengesetzt werden, die mit einer beliebigen Anzahl von Argumenten funktionieren kann:

foo [bar x, bar y] = & gt; (foo . map bar) [x, y]

    
HostileFork 18.05.2016 05:44
quelle
2

A Control.Arrow Alternative:

%Vor%

Nicht so gut lesbar wie die zuvor geposteten Lösungen.

    
chi 18.05.2016 07:46
quelle
2

Sinnlose Äquivalenzen für \x y -> foo (bar x) (bar y) :

erisco 19.05.2016 17:03
quelle

Tags und Links