summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2016-01-19 09:27:12 +0100
committerGregor Kleen <gkleen@yggdrasil.li>2016-01-19 09:27:12 +0100
commite3b224ba73c9768c8099348586f5b13d120d64ec (patch)
treeeb689e377f583f48cf248dffd5ef2791b14e5902
parent115c9360fc9432a6ef11498f137a6ca93a886d8a (diff)
downloaduni-e3b224ba73c9768c8099348586f5b13d120d64ec.tar
uni-e3b224ba73c9768c8099348586f5b13d120d64ec.tar.gz
uni-e3b224ba73c9768c8099348586f5b13d120d64ec.tar.bz2
uni-e3b224ba73c9768c8099348586f5b13d120d64ec.tar.xz
uni-e3b224ba73c9768c8099348586f5b13d120d64ec.zip
FFP 12 import
-rw-r--r--ws2015/ffp/blaetter/12/FFP_U12_Persist.hs188
1 files changed, 188 insertions, 0 deletions
diff --git a/ws2015/ffp/blaetter/12/FFP_U12_Persist.hs b/ws2015/ffp/blaetter/12/FFP_U12_Persist.hs
new file mode 100644
index 0000000..c087fae
--- /dev/null
+++ b/ws2015/ffp/blaetter/12/FFP_U12_Persist.hs
@@ -0,0 +1,188 @@
1-- Fortgeschrittene Funktionale Programmierung,
2-- LMU, TCS, Wintersemester 2015/16
3-- Steffen Jost, Alexander Isenko
4--
5-- Übungsblatt 12. 20.01.2016
6--
7-- Thema: Database.Persist & Yesod.Persist
8--
9-- Anweisung:
10-- Bearbeiten Sie ggf. zuerst noch A11-3 und A11-4,
11-- falls Sie diese noch nicht bearbeitet haben!
12--
13-- Gehen Sie diese Datei durch und bearbeiten Sie
14-- alle Vorkommen von undefined bzw. die mit -- !!! TODO !!!
15-- markierten Stellen. Testen Sie Ihre Lösungen mit GHCi!
16--
17
18{-# LANGUAGE GADTs #-}
19{-# LANGUAGE ViewPatterns #-}
20{-# LANGUAGE FlexibleContexts #-}
21{-# LANGUAGE EmptyDataDecls #-}
22{-# LANGUAGE MultiParamTypeClasses #-}
23{-# LANGUAGE GeneralizedNewtypeDeriving #-}
24{-# LANGUAGE OverloadedStrings #-}
25{-# LANGUAGE TypeFamilies #-}
26{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
27
28
29import qualified Data.Text as T
30import Data.Time.Clock (getCurrentTime)
31import Database.Persist
32import Database.Persist.Sqlite
33import Database.Persist.TH
34import System.Environment (getArgs)
35
36import Control.Applicative
37import Control.Monad
38import Control.Monad.IO.Class
39
40-- Nur für A11-2 benötigt:
41import Language.Haskell.TH
42
43
44-- A11-1
45--
46-- Erstellen Sie mit Database.Persist ein simples Kommandozeilen-Tool
47-- zum Zugriff auf eine Datenbank zur Verwaltung von Hausaufgaben.
48-- Es soll immer auf die Datenbank im gleichen Verzeichnis zugegriffen werden.
49--
50-- Es gibt 3 Mögliche Verwendungsarten des Tools:
51--
52-- 1) > tool <name> <matrikel> <nr> <abgabe>
53--
54-- Legt eine Abgabe <abgabe> für Übung <nr>
55-- von Student <name> mit Matrikelnummer <matrikel>
56-- in der Datenbank ab.
57-- Ist der Student unbekannt, so wird er angelegt.
58-- Die Kombination aus Name und Matrikelnummer muss einzigartig sein.
59--
60-- 2) > tool <nr>
61--
62-- Zeigt alle Abgaben zur Übung <nr> auf dem Bildschrim an.
63-- Zu jeder Abgabe wird auch der abgebende Student aufgeführt.
64--
65-- 3) > tool <name>
66--
67-- Zeigt alle Studenten mit diesem Namen an,
68-- so wie jeweils die Anzahl der im System gespeicherten Abgaben
69-- zu allen Übungen.
70--
71-- Ein Demo folgt weiter unten.
72
73
74sqliteDB = "demo.sqlite"
75
76main :: IO ()
77main = do
78 putStrLn "Hallo zu HuniworX!"
79 args <- getArgs
80 -- !!! TODO !!!
81 return ()
82
83
84hilfstext :: IO ()
85hilfstext = do
86 putStrLn "Optionen sind:"
87 putStrLn " 1) Studentenname"
88 putStrLn " 2) Übungsnummer"
89 putStrLn " 3) Studentenname, Matrikel, Übungsnr, Abgabe"
90 putStrLn "Optionen 1 & 2 sind Abfragen; 3 ist Eingabe"
91
92maybeRead :: Read a => String -> Maybe a
93maybeRead (reads -> [(x,"")]) = Just x
94maybeRead _ = Nothing
95
96maybeToInt :: String -> Maybe Int
97maybeToInt = maybeRead
98
99
100{- DEMO:
101
102> ./FFP_U11_Persist Steffen 1234 1 "Etwas gemacht"
103Hallo zu HuniworX!
104Migrating: CREATE TABLE "student"("id" INTEGER PRIMARY KEY,"name" VARCHAR NOT NULL,"matrikel" INTEGER NOT NULL,CONSTRAINT "unique_student" UNIQUE ("name","matrikel"))
105Migrating: CREATE TABLE "abgabe"("id" INTEGER PRIMARY KEY,"ersteller_id" INTEGER NOT NULL REFERENCES "student","ubung" INTEGER NOT NULL,"abgabe" VARCHAR NOT NULL)
106Abgabe von Steffen für Übung 1 angenommen.
107> ./FFP_U11_Persist Steffen 6666 1 "Nix gemacht"
108Hallo zu HuniworX!
109Abgabe von Steffen für Übung 1 angenommen.
110> ./FFP_U11_Persist Steffen 6666 2 "Fast nix gemacht"
111Hallo zu HuniworX!
112Abgabe von Steffen für Übung 2 angenommen.
113> ./FFP_U11_Persist Steffen 1234 2 "Schön gemacht."
114Hallo zu HuniworX!
115Abgabe von Steffen für Übung 2 angenommen.
116> ./FFP_U11_Persist Hilde 9999 2 "Vorbildlich gemacht."
117Hallo zu HuniworX!
118Abgabe von Hilde für Übung 2 angenommen.
119> ./FFP_U11_Persist Steffen 1234 3 "Gut gemacht."
120Hallo zu HuniworX!
121Abgabe von Steffen für Übung 3 angenommen.
122> ./FFP_U11_Persist Steffen
123Hallo zu HuniworX!
124Steffen 1234 Abgaben: 3
125Steffen 6666 Abgaben: 2
126> ./FFP_U11_Persist 2
127Hallo zu HuniworX!
128----
129Steffen 6666 für Übung 2
130 Fast nix gemacht
131----
132Steffen 1234 für Übung 2
133 Schön gemacht.
134----
135Hilde 9999 für Übung 2
136 Vorbildlich gemacht.
137> ./FFP_U11_Persist 1
138Hallo zu HuniworX!
139----
140Steffen 1234 für Übung 1
141 Etwas gemacht
142----
143Steffen 6666 für Übung 1
144 Nix gemacht
145> ./FFP_U11_Persist Fuu 1
146Hallo zu HuniworX!
147Optionen sind:
148 1) Studentenname
149 2) Übungsnummer
150 3) Studentenname, Matrikel, Übungsnr, Abgabe
151Optionen 1 & 2 sind Abfragen; 3 ist Eingabe
152>
153-}
154
155
156
157
158-- A11-2 TemplateHaskell
159--
160-- Hier ist etwas zum Knobeln oder Ausprobieren!
161-- Was machen die folgenden TemplateHaskell Funktionen?
162-- (zum Ausführen in ghci die Option -XTemplateHaskell nicht vergessen)
163--
164
165-- a)
166foobar :: Int -> Int -> ExpQ
167foobar n i = lamE [pat] rhs
168 where pat = tupP (map varP xs)
169 rhs = varE (xs !! (i - 1))
170 xs = [ mkName $ "x" ++ show j | j <- [1..n] ]
171
172
173-- b)
174barfoo :: Int -> ExpQ
175barfoo n = do
176 ns <- replicateM n (newName "x")
177 lamE [foldr (\x y -> conP '(:) [varP x,y]) wildP ns] (tupE $ map varE ns)
178
179
180-- c)
181fuubaz:: Int -> Int -> ExpQ
182fuubaz n m = do
183 let f = mkName "f"
184 let v i j = mkName $ "x" ++ (show i) ++ (show j)
185 let tupleps = [tupP [varP (v i j) | j <- [1..n]] | i <- [1..m] ]
186 let args = [(foldl appE (varE f) [varE $ v i j | i <- [1..m]]) | j <- [1..n]]
187 lamE ((varP f):tupleps) (tupE args)
188