Zusammensetzung mit dyadischem Operator?

8

Ich möchte etwas ziemlich Einfaches tun; Ich benutze den Operator (++) mit Data.Map insertWith , und es funktioniert gut, aber ich möchte Dubletten in den erzeugten Wert zu beseitigen, also will es mit Nub komponieren.

Ich habe versucht (nub (++)), (nub $ (++)), (nub. (++)), alles ohne Erfolg, da der Typ von (++) nicht mit dem erwarteten übereinstimmt Art der Noppe ([a]).

Ich könnte natürlich eine Hilfsfunktion oder ein Lambda definieren, aber ich denke, dass es wahrscheinlich eine Zusammensetzung gibt, die klarer wäre.

Hinweise bitte!

    
guthrie 06.07.2011, 15:36
quelle

5 Antworten

10

Sie können dies als

schreiben %Vor%

Beispiel:

%Vor%

Im Allgemeinen haben Sie

%Vor%

Hier ist die Ableitung dieser Identität für ((nub .) .) :

%Vor%

Es gibt einen netten Artikel über diese (und verwandte) Idiome, aber es ist in Russisch: - (

    
Mikhail Glushenkov 06.07.2011, 16:02
quelle
6

Was Sie wollen, scheint eine Komposition aus binären und unären Funktionen zu sein, wie folgt:

%Vor%

Und Sie fragen nach einer point-free-Version (ohne die Variablen a und b zu erwähnen). Lassen Sie uns versuchen, sie nacheinander zu beseitigen. Wir beginnen mit b und verwenden dabei die Tatsache, dass f (g x) = f . g :

%Vor%

a ist das nächste. Lassen Sie uns zuerst den Ausdruck entschuldigen:

%Vor%

Und wenden Sie die gleiche Kompositionsregel erneut an:

%Vor%

Dies kann weiter geschrieben werden als:

%Vor%

Oder sogar als

%Vor%

Hier trennt jedes (.) ein Argument von der Binärfunktion und Sie benötigen zwei davon, weil die Funktion binär ist. Dieses Idiom ist sehr nützlich, wenn es für einen Funktor verallgemeinert wird: fmap . fmap (Beachten Sie, dass fmap äquivalent zu . ist, wenn die Funktion als Funktor betrachtet wird). Dies ermöglicht es Ihnen, alle Funktionen auszuschalten, zB können Sie schreiben:

%Vor%

Ihr Ergebnis lautet also:

%Vor%

Bearbeiten:

Ich denke, ich habe die Antwort gefunden, die mein Gehirn zu reproduzieren versuchte: Haskell-Funktion Kompositionsoperator vom Typ (c → d) → (a → b → c) → (a → b → d)

    
Rotsor 06.07.2011 15:56
quelle
3

Dieses Problem wird auf besonders einfache und schöne Weise von semantischen Editor-Kombinatoren gelöst. Konferieren:

Ihre endgültige Zusammensetzung würde wie folgt aussehen:

%Vor%     
luqui 06.07.2011 17:09
quelle
1

Sie können den etwas komisch aussehenden (.).(.) -Kombinator verwenden:

%Vor%

Es wird wahrscheinlich lesbarer sein, nur eine Lambda oder eine Hilfsfunktion in einer where -Klausel zu verwenden.

    
hammar 06.07.2011 15:55
quelle
1

Ich glaube nicht, dass der gewünschte Kompositionsoperator als einzelne Funktion in einer Standardbibliothek existiert. Der kürzeste Weg, um es zu schreiben, ist wahrscheinlich ((.).(.)) . Wenn Sie die Functor Definition für ((->) t) verwenden, können Sie sie auch als fmap . fmap oder, wenn Sie fmap fmap fmap bevorzugen, schreiben.

Alle oben genannten Punkte sind ziemlich kryptisch, aber das Idiom ist häufig genug, dass viele Leute erkennen werden, was Sie tun.

Übrigens sollten Sie vermeiden, Funktionen von zwei Argumenten "dyadisch" in Haskell aufzurufen, denn wenn Sie diese Terminologie auf Funktionen eines Arguments erweitern, werden Sie wirklich verwirren.

Siehe auch diese Frage für einige verwandte Themen Diskussion.

Sie finden auch viele Kombinatoren mit sehr intuitiven Namen in dieser Bibliothek.

    
C. A. McCann 06.07.2011 15:57
quelle

Tags und Links