Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Lehre / SS 2014 / Programmierung und Modellierung / ProMo Material / ProMo V05 Code


Inhaltsbereich

ProMo V05 Code

Gesammelte Code Beispiele aus der Vorlesung 05: - Personen Records - Früchte - Maybe - Either

Haskell source code icon ProMo05_Code.hs — Haskell source code, 3 KB (3760 bytes)

Dateiinhalt

-- CODE aus der ProMo Vorlesung 5:
--------------------------------------

data MeinTyp = MeinKonstruktor Int Bool
  deriving (Eq,Show)

myShow :: MeinTyp -> String
myShow (MeinKonstruktor i True)  = "T("++(show i)++")"
myShow (MeinKonstruktor i False) = "F("++(show i)++")"


--------------------------------------


data Circle  = Circle  Double Double Double
data Point3D = Point3D Double Double Double
data Monster = Monster Double Double Double

hydralisk :: Monster
hydralisk = Monster 17.3 17.3 80.0

myCircle :: Circle
myCircle = Circle 17.3 17.3 80.0

area :: Circle -> Double
area (Circle _ _ r) = pi * r^2 

x1 = area myCircle     -- ok
-- x2 = area hydralisk -- Typfehler!


-------------------------------------


data Person' = Person'  String Int Int Int Int
p0 = Person' "Tyrion" 135 26 7 0

data Person = Person { name::String, height,age,mates,offspring::Int }  
  deriving Show
  
p1 = Person "Tyrion" 135 26 7 0
p2 = Person { height=166, age=35, mates=3, offspring=3, name = "Cersei"}
p3 = Person  "Jaimie" 187 35 1 3      -- alte Syntax auch noch erlaubt
p4 = p1 { name = "Imp" }
p5 = p1 { mates = 2 + mates p1 }

showPerson :: Person -> String
showPerson Person { age=a, name=n } =  n ++ ' ':show a

hasChildren :: Person -> Bool
hasChildren Person { offspring=n } | n > 0 = True
hasChildren _ = False

{- Für leichtere Erweiterbarkeit der Felder kann man auch 
   einen spezialisierten Konstruktor anstatt Person verwenden:
-}
-- data Person = Person { name::String, height,age,mates,offspring,scars ::Int }  
personDefault = Person  { height=180, age=33, mates=0, offspring=0, name = "Dummy"} --, scars=0}

p2' = personDefault { height=166, age=35, mates=3, offspring=3, name = "Cersei"}
{- Vorteil:  keine Warnungen; gut, wenn akzeptabler Default existiert
   Nachteil: keine Warnungen; Warnungen helfen zu Erkennen, wo überall Änderungen vorgenommen werden müssen
-}


---------------------------------------------------------------------


data Früchte = Apfel  {preis::Int, anzahl::Int}                    -- 2 Argumente
             | Birne  {preis::Int, anzahl::Int}                    -- 2 Argumente
             | Banane {preis::Int, anzahl::Int, krümmung::Double}  -- 3 Argumente
 deriving (Show, Eq)
             
meineFrüchte :: [Früchte] 
meineFrüchte = [Apfel 90 2, Apfel 300 3, 
                Birne 60 1, Banane 80 7 0.3]  
  
gesamtPreis :: [Früchte] -> Int
gesamtPreis []    = 0
gesamtPreis (h:t) = (preis h * anzahl h) + gesamtPreis t
  
{- Achtung:
    krümmung :: Früchte -> Double  
   ist eine partielle Funktion! So etwas möglichst nicht verwenden!
   Stattdessen selbst definierte sichere Funktion verwenden: 
-}
   
getKrümmung :: Früchte -> Maybe Double
getKrümmung Banane {krümmung=k} = Just k
getKrümmung _                   = Nothing
   
{- Anderes Beispiel einer unnötig partiellen nicht-rekursiven Funktion:-}
isTrue :: Bool -> String -- Don't!
isTrue True = "ist True!"

  
-----------------------------------------  
  
  
data MyMaybe a = MyNothing | MyJust a  

isJust :: MyMaybe a -> Bool
isJust MyNothing = False
isJust _         = True

fromMaybe :: a -> MyMaybe a -> a
fromMaybe def MyNothing  = def
fromMaybe _   (MyJust a) = a

catMaybes :: [MyMaybe a] -> [a]
catMaybes ls = [x | MyJust x <- ls]
  
  
--------------------------------------------  
  
  
data MEither a b  =  MLeft a | MRight b

isRight :: MEither a b -> Bool
isRight (MRight _) = True
isRight _          = False

lefts   :: [MEither a b] -> [a]
lefts xs = [ x | MLeft x <- xs ] 

partitionEithers :: [MEither a b] -> ([a],[b])
partitionEithers []    = ([],[])
partitionEithers (h:t) = 
  let (ls,rs) = partitionEithers t 
  in case h of
        (MLeft  l) -> (l:ls,  rs)
        (MRight r) -> (  ls,r:rs)


Artikelaktionen


Funktionsleiste