Hat diese einfache Haskell-Funktion bereits einen bekannten Namen?

8

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!

    
gimboland 22.10.2010, 15:04
quelle

4 Antworten

12

Ein kleiner Punkt: Es ist möglich, dies nur mit fmap (nein >>= ) zu schreiben, also brauchen Sie wirklich nur eine Functor -Instanz:

%Vor%

Diese Version ist etwas allgemeiner. Um Ihre Frage zu einer Pointfree-Version zu beantworten, können Sie einfach pointfree fragen:

%Vor%

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:

%Vor%

<$> 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.

    
Travis Brown 22.10.2010, 15:23
quelle
13

Wenn die Traversable und Foldable Instanzen für (,) x) in der Bibliothek waren (und ich nehme an, ich muss etwas dafür verantwortlich machen) ...

%Vor%

... dann wäre dies (manchmal "Stärke" genannt) eine Spezialisierung von Data.Traversable.sequence .

%Vor%

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.

    
pigworker 22.10.2010 16:12
quelle
8

Ich habe es in keiner Haskell-Bibliothek geschrieben (obwohl es wahrscheinlich in Kategorie-Extras ist), aber es ist allgemein bekannt als die "Tensorstärke" einer Monade. Siehe:

Ссылка

Ссылка

    
mokus 22.10.2010 15:42
quelle
3

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.

    
Thomas M. DuBuisson 22.10.2010 15:08
quelle

Tags und Links