Sagen wir, ich habe eine Liste von Funktionen
%Vor% jede mit dem Typ a -> a
Ich habe auch eine Liste von Werten, sagen Zahlen, aber alles sollte hier funktionieren
%Vor% Ich möchte jede Funktion in functions
auf den entsprechenden Wert in vals
Mein erster Instinkt ist, ein Lambda und zipWith wie:
zu verwenden %Vor%Aber ehrlich gesagt sieht das hässlich aus und nicht etwas, was ich in einer so netten Sprache wie Haskell erwarten würde. Eine Funktionsanwendungsfunktion klingt wie die Lösung. Gibt es so etwas? Fehle ich etwas und es gibt eine viel bessere Lösung für mein Problem? Ich habe tatsächlich dieses Konstrukt für eine Projekt-Euler-Lösung geschrieben. Es funktioniert, aber ich mag es nicht.
$
ist eine Funktionsanwendung. Die Tatsache, dass es eine besonders niedrige Priorität hat, führt manchmal zu einer Schleife.
Seltsamerweise
%Vor%funktioniert auch!
Aber wirklich, zipWith ($)
ist der richtige Weg dies zu schreiben.
Hier ist eine weitere Option, die Sie vielleicht ein wenig nachdenken lässt.
%Vor% A ZipList
ist nur ein Wrapper um eine Liste. Die Definition von <*>
für ein ZipList
sagt "Zip die Liste der Funktionen (auf der linken Seite) mit der Liste der Argumente (auf der rechten Seite) durch Anwenden jeder Funktion auf ein Argument wiederum".
Dies steht im Gegensatz zur Definition von <*>
für eine reguläre Liste, die besagt "nimm jedes mögliche Paar von (Funktion, Argument) aus diesen beiden Listen und übertrage die Funktion auf das Argument".
Tags und Links haskell higher-order-functions