Mit Haskell map-Funktion berechnet die Summe einer Liste
Haskell
addm::[Int]->Int
addm (x:xs) = sum(x:xs)
War ich in der Lage zu erreichen, um eine Summe einer Liste mit sum
Funktion aber ist es möglich die Summe einer Liste mit map
Funktion? Auch was die Verwendung der map-Funktion?
- Sie vereinfachen können Sie
addm
nuraddm = sum
. - Hinweis: Ihre addm-Funktion ist nicht definiert für die leere Liste, es sei denn, Sie etwas tun, wie Waldheinz schlägt.
InformationsquelleAutor Sudantha | 2011-05-30
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht wirklich nutzen
map
zusammenfassend eine Liste, weil die Karte behandelt jedes element in der Liste, die unabhängig von den anderen. Sie könnenmap
beispielsweise erhöht jeder Wert in einer Liste, wie inEinen anderen Weg, um Ihre addm wäre, die Nutzung foldl:
Hier ist es, das vermeintlich Unmögliche definition von
sum
im Hinblick aufmap
:dieser zeigt tatsächlich, wie
scanl
umgesetzt werden können, in Bezug aufmap
(undzip
undlast
), die oben genannten gleichwertig zufoldl (+) 0 xs === last $ scanl (+) 0 xs
:Ich erwarte, dass man berechnen kann, viele Dinge mit
map
, die Vermittlung von Informationen aller Art fließen durchzip
.edit: das oben ist nur ein
zipWith
in Verkleidung natürlich (undzipWith
ist eine Artmap2
):Dies scheint darauf hinzuweisen, dass
scanl
ist vielseitiger alsfoldl
.Functor []
Beispiel zur Berechnung der Länge einer Liste; und Ihre Antwort ist, dass Sie verwenden können, eineApplicative []
Instanz zu tun (im GrundeZipList
). Ich weiß, ich bin "bereichern" die Frage (so zu sagen) durch das LesenFunctor
hinein, aber durch das argument, Sie bereichern es mehr, als ich bin, seitApplicative
ist mächtiger alsFunctor
.map
ist nicht nurfmap
. IOWinstance Functor []
spricht von Listen als sets, da nurfmap
verfügbar ist &nichts anderes. mit sets gibt es nur die Mitgliedschaft, nicht in der Lage, so gibt es keine Ordnung. wir können sehr gut definierenApplicative
für Listen-als-sets auch, mit dem kartesischen Produkt die einzig mögliche Umsetzung - gerade weil es kein Konzept der position. Aber mit ihm, innere Produkt wird eine weitere Möglichkeit (d.h.zip
, d.h.ZipList
).zip
. Wenn Sie Objekt, das bedeutet, dass Sie die Behandlung von Listen als nicht-sequenziert, ungeordnete Sammlungen.map
ist die einzige Funktion, die erlaubt ist. Also ja, diese Antwort nutztmap
,zip
undlast
im Endeffekt die Umsetzungsum = foldl (+) 0
, aber immer noch, es nutztmap
in eine nicht-triviale Art und Weise, dies zu erreichen.Es ist nicht möglich
map
zu reduzieren, eine Liste seiner Summe. Diese rekursive Muster ist einfold
.Beachten Sie übrigens, dass Sie definieren können
map
als fold als auch:Dies ist, weil
foldr
ist die kanonische rekursive Funktion, die auf Listen.Referenzen: Ein tutorial über die Universalität und die Ausdruckskraft der Falten, Graham Hutton, J. Funktionale Programmierung 9 (4): 355-372, Juli 1999.
Nachdem einige Einsichten, die ich hinzufügen, die eine andere Antwort: Sie können nicht die Summe einer Liste mit
map
ist, aber Sie können die Summe mit seinem monadischen versionmapM
. Alles, was Sie tun müssen, ist die Verwendung einesWriter
Monade (siehe LYAHFGG) über dieSum
monoid (siehe LYAHFGG).Schrieb ich eine spezielle version, das ist wahrscheinlich einfacher zu verstehen:
Adder
ist nur ein wrapper um einige geben, die hält auch ein "running sum." Wir könnenAdder
eine Monade, und hier spielt es einige Arbeit: Wenn die operation>>=
(ein.k.ein. "binden") ausgeführt wird, gibt es das neue Ergebnis und der Wert der Laufenden Summe, das Ergebnis plus die Originale Summe. DietoAdder
- Funktion nimmt ein Int und erzeugt eineAdder
hält, dass dieses argument sowohl gewickelt als Wert und als laufende Summe (eigentlich interessiert uns nicht der Wert, sondern nur in der Summe Teil). Dann insum'
mapM
tun kann ist seine Magie: Während es funktioniert ähnlich wiemap
für die eingebetteten Werten in der Monade, der es ausführt, "monadischen" Funktionen wietoAdder
, und Ketten diese Anrufe (es verwendetsequence
um dies zu tun). An diesem Punkt erhalten wir durch die "Hintertür", die unsere Monade, die Interaktion zwischen der Listen-Elemente, die die standard -map
fehlt.Map "Karten" jedes element der Liste, um ein element in Ihrer Ausgabe:
Dieser gibt eine Liste der Quadrate.
Summe aller Elemente in einer Liste verwenden Sie Falten:
+ ist die Funktion, die Sie anwenden möchten, und 0 ist der erste Wert (0-Summe, 1 für Produkt etc)
Wie die anderen Antworten zeigen, ist der "normale" Weg ist die Verwendung eines
fold
Funktionen. Allerdings ist es möglich, etwas zu schreiben, ziemlich ähnlich zu einerwhile
- Schleife in imperativen Sprachen:Er fügt hinzu, die ersten beiden Elemente der Liste zusammen, bis es endet mit einem element der Liste und gibt diesen Wert (mit
head
).Erkenne ich diese Frage bereits beantwortet wurde, aber ich wollte noch hinzufügen das gedacht...
Ich glaube, es gibt die Konstante 1 für jedes Element in der Liste, und gibt die Summe zurück!
Vielleicht nicht der beste Programmierstil, aber es war ein Beispiel mein professor hat zu uns Studenten, dass scheint zu beziehen sich auf diese Frage gut.
map
kann niemals das primäre tool für die Summierung der Elemente eines Containers, in viel die gleiche Weise, dass ein Schraubendreher, kann niemals das primäre tool für einen Film. Aber Sie können einen Schraubendreher verwenden, um fix einen Film-Projektor. Wenn Sie wirklich wollen, können Sie schreibenNatürlich, das ist dumm. Sie können einen mehr Allgemeinen, und möglicherweise effizienter, version:
Oder besser, benutzen Sie einfach
sum
, weil Sie die eigentlich gemacht für den job.