In Haskell Data.Set
implementiert einen konkreten Set-Typ. Normale []
Listen implementieren auch alle Operationen eines Satzes (in Data.List
). Aber es scheint keine vordefinierte Set
Typklasse zu geben, die beide implementieren. Sie können eine selbst implementieren:Wo ist die Set-Klasse?
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FunctionalDependencies #-}
module Set where
import qualified Data.List as ConcreteList
import qualified Data.Set as ConcreteSet
class Set set a | set -> a where
empty :: set
singleton :: a -> set
insert :: a -> set -> set
delete :: a -> set -> set
union :: set -> set -> set
intersection :: set -> set -> set
member :: a -> set -> Bool
filter :: (a -> Bool) -> set -> set
instance (Ord a) => Set (ConcreteSet.Set a) a where
empty = ConcreteSet.empty
singleton = ConcreteSet.singleton
insert = ConcreteSet.insert
delete = ConcreteSet.delete
union = ConcreteSet.union
intersection = ConcreteSet.intersection
member = ConcreteSet.member
filter = ConcreteSet.filter
instance (Eq a) => Set [a] a where
empty = []
singleton e = [e]
insert = (:)
delete = ConcreteList.delete
union = ConcreteList.union
intersection = ConcreteList.intersect
member = ConcreteList.elem
filter = ConcreteList.filter
aber es scheint, dass dies bereits getan worden wäre, wenn dies der Weg ist zu gehen. Meine Frage ist also: Wo ist die Set
Typklasse oder welche alternative Lösung hat die Haskell-Community?
Meine Frage ist zugegebenermaßen sehr ähnlich zu Why is Haskell missing “obvious” Typeclasses, aber indem ich konkreter bin (auf ein konkretes Beispiel mit Beispielimplementierung konzentrierend), hoffe ich, noch konkretere Antworten zu bekommen.
hat, aber diese beiden verhalten sich anders: 'delete 1 (insert 1 (insert 1 empty)) 'wird in der einen leer sein, aber nicht in der anderen ... (die Sie mit' member' überprüfen können, wenn Sie argumentieren, dass es keine Gleichheit gibt) – Carsten
@Carsten, Sie haben gerade einen Fehler in meiner Implementierung gefunden. – hkBst
;) - Ich denke nur an eine ganz bestimmte Entität, wenn ich 'Set' sage (deshalb würde ich es Sammlung oder etwas nennen) – Carsten