2016-03-29 6 views
-3

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?

+1

"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

+0

Warum würde ich Probleme bekommen? –

+0

weil 'length' normalerweise ein 'Int' zurückgibt und Sie Probleme bekommen, wenn Sie versuchen, ein 'Float' (die Summe) durch 'Int' zu teilen. – Carsten

Antwort

1

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!)

+2

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

+0

@Jubobs ist Birds Ansatz äquivalent zu 'Datenpaar a b = Paar! A! B 'zusammen mit' foldl'? – Zeta

+0

@Zeta Im Wesentlichen ja. – Jubobs

1

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

Verwandte Themen