Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

Code 06

Code der Live-Demos während Foliensatz 06. Inklusive korrekter Instanz für Read Frucht

Haskell source code icon Vorlesung7.hs — Haskell source code, 1 KB (1852 bytes)

Dateiinhalt

-- firstDiff :: Eq a => [a] -> [a] -> Maybe a
firstDiff :: [Int] -> [Int] -> Maybe Int
firstDiff (h1:t1) (h2:t2)
  | h1 == h2  = firstDiff t1 t2
  | otherwise = Just h2
firstDiff _ _ = Nothing

data Frucht = Apfel (Int,Int) | Birne Int Int
 -- deriving (Eq, Show, Read) -- alles automatisch ableiten
 deriving (Eq)
 
-- oder zu Fuss definieren:
instance Show Frucht where
  show (Apfel (z,p)) = "Apfel("++(show z)++")"
  show (Birne p z)   = "Birne("++(show z)++")"

-- Einfache Parser für Frucht, kann nur Apfel/Birne mit einstelliger Anzahl parsen  
myRead :: String -> Frucht
myRead ('A':'p':'f':'e':'l':'(':z:')':[]) = Apfel (read [z],0)

-- In der Vorlesung auf die Schnelle nicht hinbekommen,
-- hier ist es nun die Definition für den einfachen Parser:
instance Read Frucht where
  readsPrec _ ('A':'p':'f':'e':'l':'(':z:')':rest) = [(Apfel (read [z],0), rest)]
  readsPrec _ ('B':'i':'r':'n':'e':'(':z:')':rest) = [(Birne 0 (read [z]), rest)]
  readsPrec _ other = [(undefined, other)]

{- read ist durch das elementare readsPrec definiert:
  > read "Apfel(2)" :: Frucht
  Apfel(2)
  > read "Birne(3)" :: Frucht
  Birne(3)
  > read "Birne(35)" :: Frucht
  *** Exception: Prelude.read: no parse
 -}
  
  
instance Ord Frucht where
  compare (Apfel (z1,_)) (Apfel (z2,_)) = negOrd (compare z1 z2)
  compare (Birne _ z1)    (Birne _ z2 ) = negOrd (compare z1 z2)
  -- compare (Apfel (z1,_))  (Birne _ z2)  = LT --Variante. Wie wollen wir ordnen?
  -- compare (Birne _ z1)   (Apfel (z2,_)) = GT
  compare (Apfel (z1,_))  (Birne _ z2)  = negOrd (compare z1 z2) 
  compare (Birne _ z1)   (Apfel (z2,_)) = negOrd (compare z1 z2) 
 
negOrd :: Ordering -> Ordering
negOrd LT = GT
negOrd GT = LT
negOrd EQ = EQ

{-
 > :m + Data.List
 > sort [Apfel (4,5), Birne 6 7, Birne 0 0, Apfel (1,1), Apfel (1,1)]
 [Birne(7),Apfel(4),Apfel(1),Apfel(1),Birne(0)]
-}

Artikelaktionen

abgelegt unter:

Funktionsleiste