annotate exercises/src/Exercise_15.hs @ 39:9a7b9e0c9eb0 default tip

week 15 tutorial
author Markus Kaiser <markus.kaiser@in.tum.de>
date Fri, 08 Feb 2013 00:06:20 +0100
parents a10156e1609a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
1 module Exercise_15 where
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
2
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
3 {-
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
4 Wichtiges:
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
5 - Syntax: Typannotation, Assoziativität, Pattern Matching, Guards, Currying, List Comprehensions
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
6 - Typisierung: Typvariablen, Typklassen, Typbestimmung
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
7 - QuickCheck
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
8 - Induktionsbeweise: Schema!, Fallunterscheidung, Generalisierung, Strukturelle Induktion
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
9 - Higher Order Functions: map, filter, fold, Lambdas, (.)
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
10 - Pointfree Notation
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
11 - Module, Typlassen, Instanzen
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
12 - Datentypen: data vs. type vs. newtype, Abstraktionsfunktionen
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
13 - (Huffman, Parser)
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
14 - Lazy Evaluation: Redexes, Outside In, Unendliche Datenstrukturen
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
15 - IO: do-Notation, warum die Sonderbehandlung?
39
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
16 - Endrekursion und Akkumulatoren
38
a10156e1609a week 15
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
17 -}
39
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
18
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
19
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
20 -- $
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
21 -- f (g x) == f $ g x
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
22 -- f $ g $ h $ i x == f . g . h $ i x == (f . g . h . i) x
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
23
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
24 doubleAllEven xs = map (*2) (filter even xs)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
25 doubleAllEven' xs = map (*2) $ filter even xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
26
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
27
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
28
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
29 -- Unendliche Datenstrukturen
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
30 nats = [1..]
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
31 nats' = 1 : map (+1) nats'
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
32
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
33 fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
34
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
35
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
36
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
37 -- (.).(.)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
38 -- f (g x y) == (f ((.).(.)) g) x y
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
39 oo :: (c -> d) -> (a -> b -> c) -> a -> b -> d
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
40 oo = (.).(.)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
41 oo' w = ((.) . (.)) w
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
42 oo'' w = (.) ((.) w)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
43 oo''' w x = (.) ((.) w) x
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
44 oo'''' w x = ((.) w) . x
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
45 oo''''' w x y = (((.) w) . x) y
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
46 oo'''''' w x y = w . (x y)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
47 oo''''''' w x y z = (w . (x y)) z
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
48 oo'''''''' w x y z = w (x y z)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
49
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
50
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
51
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
52 -- map, fold
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
53 -- [f x y | x <- xs, y <- ys, p y]
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
54 -- == concatMap (\x -> map (\y -> f x y) (filter p ys)) xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
55
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
56 map' :: (a -> b) -> [a] -> [b]
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
57 map' f xs = [f x | x <- xs]
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
58
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
59 map'' f = foldr g []
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
60 where
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
61 g x xs = (f x) : xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
62 -- == (:) (f x)-}
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
63 -- == ((:) . f)-}
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
64
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
65 map''' f = foldl (\xs x -> xs ++ [f x]) []
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
66
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
67 foldl' :: (a -> b -> a) -> a -> [b] -> a
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
68 foldl' _ acc [] = acc
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
69 foldl' f acc (x : xs) = foldl' f (f acc x) xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
70
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
71 foldr' _ acc [] = acc
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
72 foldr' f acc (x : xs) = f x (foldr' f acc xs)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
73
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
74 filterMap :: (a -> Maybe b) -> [a] -> [b]
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
75 filterMap _ [] = []
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
76 filterMap f (x:xs) =
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
77 case (f x) of
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
78 Nothing -> filterMap f xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
79 Just y -> y : filterMap f xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
80
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
81
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
82
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
83 -- type vs. newtype vs. data
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
84 type Name = String
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
85 greet :: Name -> String
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
86 greet n = "Hallo, " ++ n ++ "!"
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
87
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
88 newtype Address = Address String
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
89 askForTheWay (Address a) = "How do I get to " ++ a ++ "?"
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
90
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
91 data MyList a = Empty | Element a (MyList a) deriving (Eq)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
92 instance Show a => Show (MyList a) where
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
93 show Empty = "[]"
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
94 show (Element a xs) = show a ++ ":" ++ show xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
95
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
96 myLength :: (MyList a) -> Int
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
97 myLength Empty = 0
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
98 myLength (Element _ xs) = 1 + myLength xs
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
99
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
100
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
101
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
102 -- Baumdefinitionen
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
103 data BinaryTree a = Empty | Node a (BinaryTree a) (BinaryTree a)
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
104
9a7b9e0c9eb0 week 15 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 38
diff changeset
105 data ArbitraryTree a = Empty | Node a [ArbitraryTree a]