Karte angewendet, um mehrere Argumente in Haskell
Gibt es eine Möglichkeit, die Verwendung von Haskell ist "Karte" oder etwas ähnliches mit mehreren Argumenten?
d.h. der Abstand zwischen einem gegebenen Punkt (definiert als Tupel) und eine Liste von anderen Punkte:
map distance (-3,-3) buildings
Klar, das funktioniert nicht, weil es versucht, die Karte "Abstand" zu (-3,-3), wo die Entfernung erwartet zwei Tupel:
let distance pointA pointB = sqrt ( (frst pointB - frst pointA) * (frst pointB - frst pointA) + (scnd pointB - scnd pointA) * (scnd pointB - scnd pointA) )
Abstand nimmt zwei Punkte als Argumente: man (-3,-3) in diesem Beispiel, und man wird aus der Liste ausgewählt "Gebäude".
(-3,-3) ist nur ein Beispiel. Dieser muss eine variable sein; es kann nicht hardcoded in die Funktion.
Vielleicht wird dies ein bisschen mehr Sinn machen:
buildings = [(3,-2),(2,1),(5,3),(4,3),(4,-1)]
firstDiff pointA pointB = subtract ( fst pointA ) ( fst pointB )
secondDiff pointA pointB = subtract ( snd pointA ) ( snd pointB )
distance pointA pointB = sqrt ( (firstDiff pointA pointB) * (firstDiff pointA pointB) + (secondDiff pointA pointB) * (secondDiff pointA pointB))
--- What I need to happen here is a list "score" to be created by taking all distances from a point in a list lPoints to a point in list buildings.
Du musst angemeldet sein, um einen Kommentar abzugeben.
du willst:
ist
Nachdem ich den Kommentar ja die Antwort, die ich vermute die Sie verwenden möchten
zipWith
Den Dokumentation Staaten:
Also in deinem obigen code könnte dies so Aussehen:
func1 ist die Funktion, die Sie beschrieben, in der Erwägung, dass func2 ist ähnlich, aber nimmt in mehreren start-Punkte statt nur einem und findet den Abstand zwischen jeder Kombination mit den Endpunkten.
Den Abstand Formel ist einfach:
Beachten Sie die Verwendung von pattern-matching, um zu zerlegen die Argumente eher als littering-code mit
fst
undsnd
.Die jeweiligen Entfernungen ab einem bestimmten Punkt alle Punkte in einer Liste wird dann
Obwohl die Argumente scheinen zu fehlen, diese ist bekannt, dass im Haskell-Jargon als partielle Anwendung. In
distanceFrom
haben wir zwei von Ihnen:distance p
ist eine Funktion von einem Punkt, dessen Wert ist der Punkt, der Abstand vonp
map (distance p)
ist eine Funktion, der eine Liste von Punkten, deren Wert diese Punkte den jeweiligen Entfernungen vonp
Versuchen, Ihre design-Haskell-Funktionen für die partielle Anwendung machen es einfach, zu kombinieren, kleine Funktionen in größeren. Wie bereits in ephemient Antwort, könnten Sie tragen diese einen Schritt weiter zu kommen pointfree definition (keine expliziten Argumente)—ein eleganter, fortschrittliche Stil.
Den Abstand zu jedem Punkt in
buildings
aus alle Punkte inlPoints
ist dannZum Beispiel, indem
lPoints
undbuildings
gleich, der Ausgang istAber das ist ein wenig langweilig in diesem speziellen Fall angesichts all der Redundanz. Stattdessen drucken Sie die strikte Obere Dreieck, verwenden Sie
Ausgabe: