Angenommen, ich möchte den Durchschnitt einer Liste von Fließkommawerten nehmen, dann muss ich irgendwann "sum" und "length" verwenden (eingebaute Funktionen). Können Sie eine Funktion erstellen, die den Durchschnitt der Liste der Gleitkommawerte beliebiger Länge berechnet?Wie nehme ich den Durchschnitt einer Liste ohne vordefinierte Funktionen zu verwenden?
Antwort
Sie könnten foldl'
verwenden, um ein Tupel aufzubauen, das sowohl die laufende Anzahl von Elementen als auch die laufende Summe enthält, und dann teilen, um den Durchschnitt zu erhalten.
data StrictPair a b = StrictPair !a !b
myAvg :: Fractional a => [a] -> a
myAvg [] = error "Empty list"
myAvg list =
let
tupleSum (StrictPair count sum) x = StrictPair (count + 1) (sum + x)
StrictPair totalCount totalSum = foldl' tupleSum (StrictPair 0 0) list
in
totalSum/totalCount
Die Verwendung von foldl'
und StrictPair
Kraftauswertungsspeicherprobleme zu vermeiden. (danke für die Empfehlung, @Jubobs, @Zeta, und @dfeuer!)
Zu viele Thunks: p Eine linke Falte, mit erzwungener Auswertung der Zwischenwerte, wäre hier meiner Meinung nach sinnvoller. Richard Bird zeigt, wie man genau das in Kapitel 7 seines Buches * Funktionell mit Haskell * denken kann. – Jubobs
@Jubobs ist Birds Ansatz äquivalent zu 'Datenpaar a b = Paar! A! B 'zusammen mit' foldl'? – Zeta
@Zeta Im Wesentlichen ja. – Jubobs
Nein, das ist im Prinzip überhaupt nicht möglich. Addition und Division sind notwendig, um den Mittelwert einer Zahlenliste zu berechnen. Die Funktionen, um diese für Standardtypen wie Rational
zu berechnen, sind "eingebaut".
- 1. Verwenden Sie awk, um den Durchschnitt einer Spalte zu finden
- 2. Wie man den Durchschnitt aus einer Liste von Datensätzen berechnet
- 3. X11: Wie nehme ich wirklich den Mauszeiger?
- 4. Ich versuche, den Durchschnitt von etwas zu einer Liste hinzuzufügen, aber ich bekomme einen NoneType-Fehler
- 5. Wie nehme ich zwei Listen und kombiniere sie ohne Duplikate?
- 6. Wie nehme ich den Durchschnitt zwischen zwei Werten in einer Spalte und platziere diesen Wert zwischen ihnen in Excel?
- 7. Den Durchschnitt einer Matrix finden
- 8. Wie bekomme ich den Durchschnitt einer bestimmten Kategorie über Python
- 9. Wie nehme ich JBOSS ab?
- 10. Versuchen, den Durchschnitt zu finden
- 11. Wie VC++ intrinsische Funktionen ohne Laufzeitbibliothek verwenden
- 12. Sortierung nach höchstem Durchschnitt in einer Liste
- 13. Kann ich den Durchschnitt dieser Zahlen berechnen?
- 14. Wie kopiere ich Objekte von Liste zu Liste ohne foreach?
- 15. Wie man den kleinsten Durchschnitt innerhalb einer verschachtelten Schleife zurückgibt
- 16. Scala - Durchschnitt von SomeObj.double in einer Liste berechnen [SomeObj]
- 17. Wie kann ich die Liste von Erlangs Liste verketten, ohne das List-Modul zu verwenden?
- 18. Wie erhält man den Durchschnitt einer Zeile in einer 2D-Liste in Python?
- 19. Wie wird eine vordefinierte Bibliothek zu einer VC++ - Lösung hinzugefügt?
- 20. In WPF XAML wie kann ich 2 Konstanten verketten, damit ich vordefinierte Pfade verwenden kann?
- 21. Wie findet man einen reparierten Wert in einem Array, ohne eine vordefinierte Funktion zu verwenden?
- 22. Wie nehme ich eine Zeileneingabe in C?
- 23. Wie nehme ich die Tastatureingabe in AutoIt?
- 24. Wie kann ich eine Tabelle in Oracle beschreiben, ohne den DESCRIBE-Befehl zu verwenden?
- 25. Kann ich den Iterator einer Liste eines unvollständigen Typs verwenden?
- 26. Zufällige Objekte zu einer Liste ohne Wiederholung
- 27. Wie nehme ich Video mit JMF auf, aber ohne JMF zu installieren?
- 28. Wie nehme ich das StringTokenizer-Ergebnis zu ArrayList in Java?
- 29. Wie bekomme ich den zweiten Rückgabewert von einer Funktion, ohne temporäre Variablen zu verwenden?
- 30. Wie nehme ich die Kontrollkästchen in Python?
"Ja"? Schließlich können Sie einfach Ihre eigene Länge und Summe schreiben. Beachten Sie, dass die Kombination von "Summe" und "Länge" in der Regel zu Problemen führt. – Zeta
Warum würde ich Probleme bekommen? –
weil 'length' normalerweise ein 'Int' zurückgibt und Sie Probleme bekommen, wenn Sie versuchen, ein 'Float' (die Summe) durch 'Int' zu teilen. – Carsten