Ich habe gerade diese Funktion geschrieben, die einfach ein Paar nimmt, dessen zweiter Wert in einer Monade ist, und "zieht die Monade heraus", um das ganze Paar abzudecken.
%Vor%Gibt es eine schönere und / oder kürzere oder punktfreie oder sogar Standardmethode, dies auszudrücken?
Ich habe so weit wie folgt, mit -XTupleSections eingeschaltet ...
%Vor%Danke!
Ein kleiner Punkt: Es ist möglich, dies nur mit fmap
(nein >>=
) zu schreiben, also brauchen Sie wirklich nur eine Functor
-Instanz:
Diese Version ist etwas allgemeiner. Um Ihre Frage zu einer Pointfree-Version zu beantworten, können Sie einfach pointfree
fragen:
Also, ja, eine noch kürzere Version ist möglich, aber ich persönlich finde uncurry
etwas schwierig zu lesen und vermeide es in den meisten Fällen.
Wenn ich diese Funktion in meinen eigenen Code schreiben würde, würde ich wahrscheinlich <$>
von Control.Applicative
verwenden, was ein Zeichen abriert:
<$>
ist nur ein Synonym für fmap
, und ich mag, dass es die Tatsache macht, dass dies eine Art von Funktionsanwendung ein wenig klarer ist.
Wenn die Traversable
und Foldable
Instanzen für (,) x)
in der Bibliothek waren (und ich nehme an, ich muss etwas dafür verantwortlich machen) ...
... dann wäre dies (manchmal "Stärke" genannt) eine Spezialisierung von Data.Traversable.sequence
.
so
%Vor%d. h.
%Vor% Tatsächlich verwendet die Sequenz nicht wirklich die volle Leistung von Monad
: Applicative
reicht aus. Außerdem ist in diesem Fall die Paarung mit x linear, so dass die traverse
nur <$>
anstatt andere zufällige Kombinationen von pure
und <*>
verwendet und (wie an anderer Stelle angegeben) nur benötigt wird m
hat eine funktionale Struktur.
Hoogle ist dein Freund. Wenn eine der Standardbibliotheken es dann hatte, dann hoogle für " Monad m = & gt; (a, mb) - & gt; m (a, b) " würde es finden. Beachte, dass die Funktion immer noch in einem Hackage -Paket sein kann, aber es ist oft kein Extra wert build-dep nur für kleine Funktionen wie diese.