-- Beispiel für ZF-Listennotation mit Musteranpassung type Punkt = (Float,Float) type Vektor = (Float,Float) -- verschiebe eine Punktmenge gemäß gebenem Vektor verschieb :: [Punkt] -> Vektor -> [Punkt] verschieb punkte (x,y) = [ (px+x,py+y) | (px,py) <- punkte ] -- Generierte Werte, die nicht angepasst werden können, tragen nicht zum Ergebnis bei beispielListe = [ x | xl <- [[(1,2),(3,4)], [(5,4),(3,2),(1,0)]], (3,x) <- xl ] -- Generiere Primzahlen primZahlen :: [Integer] primZahlen = [ n | n <- [2..], prim n ] prim :: Integer -> Bool prim n = teiler n == [1,n] teiler :: Integer -> [Integer] teiler n = [t | t <- [1..n], n `mod` t == 0 ] -- Zeilenweise Ausgabe einer Zahlenfolge zeigZahlen :: [Integer] -> IO() zeigZahlen = putStr . text text :: [Integer] -> String text zl = concat [ '\n': show z | z <- zl ] -- Effizientere Lösung: Das Sieb des Eratosthenes primZ :: [Integer] primZ = sieb [2..] sieb :: [Integer] -> [Integer] sieb (p:zl) = p : sieb [ z | z <- zl, z `mod` p /= 0 ] sieb [] = [] -- diese zeile kann entfallen -- Fibonacci-Zahlen -- Erste Definition liest sich gut, ist aber höchst ineffizient! fib :: Integer -> Integer -- berechnet die n-te Fibonacci-Zahl fib 1 = 1 fib 2 = 2 fib (n+2) = fib (n+1) + fib n fibs :: [Integer] -- die Liste der Fibonaccizahlen fibs = map fib [1..] -- Effizientere Lösung (aus der Literatur) fibStart :: (Integer,Integer) fibStart = (1,2) folgeFib :: (Integer,Integer) -> (Integer,Integer) folgeFib (a,b) = (b, a+b) -- Iteriere folgeFib auf fibStart n mal, um die (n+2)-te Fib-Zahl abzulesen iteriere :: Integer -> (t -> t) -> t -> t iteriere 0 f s = s iteriere (n+1) f s = f (iteriere n f s) fib' :: Integer -> Integer fib' 1 = 1 fib' 2 = 2 fib' (n+2) = snd (iteriere n folgeFib fibStart) -- Effizienzsteigerung durch Einsatz der Systemfunktion iterate, die angewendet -- auf eine Funktion f und einen Startwert s die Folge [s, f s, f (f s), f (f (f s)),...] ergibt. fibs' :: [Integer] -- Liste der Fibonacci-Folge fibs' = [ fst fibPaar | fibPaar <- iterate folgeFib fibStart ] -- Noch effizientere Lösung (Fehr): fuFibs :: [Integer] fuFibs = 1 : 2 : zipWith (+) fuFibs (tail fuFibs)