diff --git a/10/Queue.hs b/10/Queue.hs index eb2bfdabfc3b8331d8e4dca85e2ca5761d9bee05..aadbd13cb284e547f931d171f29d9339bfa9b293 100644 --- a/10/Queue.hs +++ b/10/Queue.hs @@ -1,26 +1,45 @@ -{-- -Funktionale Programmierung - Wintersemester 2022/2023 -Vorlesung am 04.01.2023 -Katharina Klost +module Queue(Queue(F), enqueue, dequeue, isEmpty, hasElem, count) where -Verschiedene Implementierungen von Queues ---} - --- Typklasse für die Queue class Queuelike s where + {- + Voraussetzung: Keine + Ergebnis: Eine neue Queue in die das Element hinten eingefügt ist, ist geliefert + -} enqueue :: a -> s a -> s a + + {- + Voraussetzung: Keine + Ergebnis: Wenn die Queue leer ist, ist Nothing geliefert, sonst Just ein Tupel + aus dem vordesten Element und der Queue ohne das vorderste Element + -} dequeue :: s a -> Maybe (a, s a) + + {- + Voraussetzung: Keine + Ergebnis: Wenn die Queue leer ist, ist False geliefert, sonst ist True geliefert + -} isEmpty :: s a -> Bool -data Queue a = Q [a] [a] deriving Show ---(Q inp out) in die erste Liste werden die Element eingefügt, aus der zweiten Liste entfernt + hasElem :: (Eq a) => a -> s a -> Bool + count :: (Eq a) => a -> s a -> Int + + +data Queue a = F [a] [a] deriving Show instance Queuelike Queue where - enqueue x (Q inp out ) = Q (x:inp) out + enqueue x (F inp out ) = (F (x:inp) out) + + dequeue (F [] []) = Nothing + dequeue (F inp []) = dequeue (F [] (reverse inp)) + dequeue (F inp (x:out)) = Just (x, (F inp out)) + + isEmpty (F [] []) = True + isEmpty _ = False - dequeue (Q [] []) = Nothing - dequeue (Q inp []) = dequeue (Q [] (reverse inp)) - dequeue (Q inp (x:out)) = Just (x, Q inp out) + hasElem :: (Eq a) => a -> Queue a -> Bool + hasElem e (F inp out) = elem e inp || elem e out - isEmpty (Q [] []) = True - isEmpty _ = False + count :: (Eq a) => a -> Queue a -> Int + count e (F inp out) = count' inp + count' out + where + count' xs = foldr (\x acc -> if x == e then acc + 1 else acc) 0 xs diff --git a/10/tut10.hs b/10/tut10.hs new file mode 100644 index 0000000000000000000000000000000000000000..34fbe0871e716ae91708e7b101855e35d5212954 --- /dev/null +++ b/10/tut10.hs @@ -0,0 +1,19 @@ +import Queue +import Data.Maybe + +data Produkt = Produkt String Int deriving Show +type Einkaufswagen = [Produkt] +type Schlange = Queue Einkaufswagen + +anstellen :: Schlange -> Einkaufswagen -> Schlange +anstellen schlange wagen = enqueue wagen schlange + +kassieren :: Schlange -> (Int, Schlange) +kassieren schlange = (preis, neueSchlange) + where + leereSchlange = F [] [] + leererEinkaufswagen = [] + + (produkte, neueSchlange) = fromMaybe (leererEinkaufswagen, leereSchlange) $ dequeue schlange + + preis = foldr (\(Produkt _ preis) acc -> acc + preis) 0 produkte