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!
Sie können dies als
schreiben %Vor%Beispiel:
%Vor%Im Allgemeinen haben Sie
%Vor% Hier ist die Ableitung dieser Identität für ((nub .) .)
:
Es gibt einen netten Artikel über diese (und verwandte) Idiome, aber es ist in Russisch: - (
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
:
a
ist das nächste. Lassen Sie uns zuerst den Ausdruck entschuldigen:
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:
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)
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.
Tags und Links haskell function-composition