2010-12-04 13 views
5

Ein Programm, das ich in Haskell schreibe hat eine Liste Instanz meines definierten Typ:Aktualisierung Tupelelemente einer Liste in Haskell

type Locals = [(String, Float)] 

Ich versuche, diese Liste zu aktualisieren, indem Sie einen String zu empfangen und den entsprechenden Schwimmer Aktualisierung Wert, aber der String ist möglicherweise nicht in der Liste enthalten.

Da Haskell-Listen unveränderlich sind, habe ich beschlossen, der einfachste Weg, dies (in Pseudo-Code) zu tun war:

if a tuple containing the string exists: 
    delete it 

add the correct data 

Ich möchte wissen:

a) Wenn es einen einfacheren Weg zu tun dies b

) Wenn nicht, wie würde ich mich über das richtige Element

Dank Löschen

Antwort

5

Das sieht wie eine assoziative Karte aus. Ich würde Data.Map verwenden. Dies wird in anderen Sprachen als "Wörterbuch" bezeichnet. Map.insert tut, was Sie brauchen.

+0

Es ist nicht immer eine gute Idee, eine "Data.Map" anstelle einer Assoziationsliste zu verwenden. 'Data.Map' ist nur für eine große Datenstruktur schneller und oft ist die Zuordnungsliste einfacher zu verwenden und führt zu saubererem Code. Hier haben wir keine Informationen darüber, wie die Assoziationsliste verwendet wird oder wie die Daten aussehen, daher ist es schwer zu sagen. – Yitz

+0

@Yitz, ich schätze, ich stelle Ihre Behauptung in Frage, dass Assoziationslisten "oft" einfacher und sauberer sind. Das habe ich noch nie erlebt. – luqui

+0

Das muss sein, weil Sie zu oft auf "Data.Map" greifen. :) – Yitz

3

Es scheint, dass der beste Weg, um diesen

filter (\x -> fst x /= s) xs 
zu tun, wäre nicht mehr Hilfe benötigen, trotzdem danke.

+1

Das würde _alle_ Einträge von 'x' entfernen (was genau das ist, was Sie wollen). Wenn Sie nur einen löschen möchten (oder wissen, dass es nur eine Übereinstimmung gibt), verwenden Sie einfach Data.List.deleteBy: 'deleteBy ((== s). Fst) xs'. Wenn Sie dies verwenden, nehme ich an, dass Sie für andere Funktionen in Data.List, wie zum Beispiel ['lookup'] (http://hackage.haskell.org/packages/archive/base/latest/doc /html/Data-List.html#v:lookup) und vielleicht ['insert'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-List.html#v :einfügen). –

0

Ich bin ein Neuling für Haskell. Nur zum Spaß.

func xs str value = (str, value) : foldr step [] xs where 
     step x acc 
      | fst x == str = acc 
      | otherwise = x:acc 
0

addToAL von Data.List.Utils tut, was Sie wollen.

Fügt der angegebenen Liste das angegebene (Schlüssel, Wert) -Paar hinzu und entfernt alle vorhandenen Paare mit demselben Schlüssel, der bereits vorhanden ist.

Verwandte Themen