2016-04-03 15 views
1

Nun, was ich tun möchte, ist eine andere Funktion zu schreiben, triangle_areas (beachten Sie die Verwendung von Plural hier), die eine Liste von Doubles nimmt, behandelt jede aufeinander folgende Gruppe von drei Doubles als die Längen der drei Seiten eines Dreiecks verwendet triangle_area, um seine Fläche zu berechnen; und nachdem alle Doubles in der Liste verarbeitet wurden, werden alle berechneten Bereiche als eine Liste von Doubles zurückgegeben.Wiederkehrende Doppel in haskell

Hier ist mein Code so weit.

+4

[Willkommen bei StackOverflow] (http://stackoverflow.com/help/asking). Hattest du jetzt eine Frage? – crockeea

+0

Verwenden Sie Muster - je nachdem, was Sie wollen 'Dreiecksbereiche (x: y: z: ds)' oder 'Dreiecksbereiche (x: ds @ (y: z: _))' – Carsten

+0

wahrscheinlich müssen Sie überprüfen, dass die Dreiecksungleichung erfüllt ist Seiten ebenso. – karakfa

Antwort

4

Verwenden Sie Mustererkennung, um die ersten drei Elemente der Eingabe abzurufen, und rekursiv. Es ist am einfachsten, wenn Sie davon ausgehen, triangle_areas immer mit einer Liste, deren Länge ein Vielfaches von 3.

triangle_areas :: [Double] -> [Double] 
triangle_areas [] = [] 
triangle_areas (a:b:c:xs) = triangle_area a b c : triangle_areas xs 

Für Listen mit einem zusätzlichen Element oder zwei, es gibt viele Optionen genannt. Man soll sie einfach ignorieren.

-- Case 3 
triangle_areas _ = [] 

Ein weiterer Grund ist auf einfache Rückkehr ein Fehler

-- Case 3 
triangle_areas _ = error "Incomplete final set" 

Noch ein anderer ist ein Either Wert

triangle_areas :: [Double] -> Either String [Double] 
triangle_areas [] = Right [] 
triangle_areas (a:b:c:xs) = Right $ triangle_area a b c : triangle_areas xs 
triangle_areas _ = Left "Incomplete final set" 

Und es gibt andere, zurückzukehren.

+0

'triangle_area' kann nicht verkettet werden (es ist keine Liste). Auch das passt nicht zum Muster für Listen der Länge 1 und 2. – jakubdaniel

+0

Ich sagte ausdrücklich, dass ich eine Eingabeliste angenommen habe, deren Länge ein Vielfaches von 3 ist. Es gibt viele Möglichkeiten, mit anderen Listen umzugehen: Ignoriere sie, wie in deiner Antwort eine Ausnahme, Rückgabe eines 'Entweder ein [Double] '- Wert für einen geeigneten Typ' a' usw. – chepner

+0

Der Benutzer kann einen Weg wählen, um die Ausnahme zu behandeln; Ich denke, das geht über den Rahmen dieser Frage hinaus. – chepner