Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
EinführungGrapefruit im Detail
Abschluss
Funktionale GUI-Programmierung in Haskell mitGrapefruit
Wolfgang Jeltsch
Brandenburgische Technische Universität CottbusLehrstuhl Programmiersprachen und Compilerbau
Haskell in Leipzig 2, Juli 2007
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
AbschlussGUI-Programmierung in HaskellGrapefruit
GUI-Programmierung in Haskell heute
in der Praxis imperative Bibliotheken mit etwasfunktionalem Flair:
Gtk2HswxHaskell
und anderedaher nur unzureichende Nutzung der Vorteile von Haskell
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
AbschlussGUI-Programmierung in HaskellGrapefruit
Rein funktionale GUI-Programmierung
Forschung zu rein funktionaler GUI-Programmierungseit über 15 Jahrenviele Bibliotheken:
fortschrittliche Konzepte umgesetzti.A. nicht für den produktiven Einsatz geeignetviele Projekte auch wieder eingeschlafen
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
AbschlussGUI-Programmierung in HaskellGrapefruit
Grapefruit-Entwicklungsziele
Aufgreifen bewährter Ideen und Entwicklung neuer TechnikenPraxistauglichkeitnatives Look-and-FeelPlattform für Forschung zu Spezifikation und Verifikationgrafischer Oberflächen
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
AbschlussGUI-Programmierung in HaskellGrapefruit
Eckdaten zur Entwicklung
Entwicklung seit Ende Februar 2007 an der BTU Cottbusderzeitige Entwickler:
Wolfgang Jeltsch (wissenschaftlicher Mitarbeiter)Matthias Reisner (Student)
momentaner Stand:zentrale Konzepte umgesetztnoch sehr kleine Auswahl an GUI-Komponenten
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
AbschlussGUI-Programmierung in HaskellGrapefruit
Architektur
Grapefruit-Kern
Gtk2Hs-Adapter
GTK+
Gtk2Hs
Anwendung
Nutzung des Gtk2Hs-Toolkits als BasisTrennung von allgemeinem und toolkitspezifischem Code(Portierung auf andere Toolkits geplant)
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Beispiel: MastermindTM-ähnliches Spiel Codebreaker
1243 Add
1243 3 01365 2 04623 2 01432 1 24635 1 1
Hinzufügeknopf aktiv, wenn gültigeKombination im Eingabefeldbeim Drücken dieses Knopfes Einfügender Kombination in die VersuchslisteAnzeige stellt immer Versuchezusammen mit Feedbacks darSpielfeld ist aktiv, wenn dieVersuchsliste nicht den Code enthält
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
GUI-Programmierung in Grapefruit
zeitliche Abläufe als First-Class-Objekte:EreignisströmeSignale
Netzwerke miteinander kommunizierender GUI-Komponenten:Arrows
Effizienz durch datengetriebene Implementierung
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Ereignisströme
DefinitionEin Ereignisstrom ist eine Folge von Ereignissen, wobei folgendesgilt:
Jedes Ereignis tritt zu einer bestimmten Zeit auf.Jedes Ereignis transportiert einen Wert.
Intuitiondata EventStream value = EventStream [(Time, value)]
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Funktionen zur Arbeit mit Ereignisströmen (Auswahl)
mempty :: EventStream valuemappend :: EventStream value
→ EventStream value→ EventStream value
fmap :: (value1→ value2)→ (EventStream value1→ EventStream value2)
filter :: (value → Bool)→ (EventStream value → EventStream value)
scan :: accu→ (accu → eventValue → accu)→ (EventStream eventValue → EventStream accu)
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Signale
DefinitionEin Signal ist eine Zuordnung von Werten zu Zeitpunkten,beschreibt also zeitabhängige Werte.
Intuitiondata Signal value = Signal (Time→ value)
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Funktionen zur Arbeit mit Signalen (Auswahl)
signal :: value → EventStream value → Signal value(〈$〉) :: (value1→ value2)
→ (Signal value1→ Signal value2)
liftA2 :: (value1→ value2 → value3)→ (Signal value1→ Signal value2 → Signal value3)
sample :: EventStream ()→ Signal value→ EventStream value
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Arrows
IntuitionArrows sind Komponenten mit je einer Eingabe und einer Ausgabe,welche miteinander vernetzt werden können, um neue Arrows zuformen.
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Arrowklassen (Auswahl)
für uns wichtige Arrowklassen:Basisklasse Arrow mit Methoden pure, (≫) und firstSubklasse ArrowLoop mit Methode loop
Zweck der Methoden:pure für Konstruktion effektloser Arrows(≫), first und loop für Konstruktion zusammengesetzterArrows
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Konstruktion zusammengesetzter Arrows
⇓≫
⇓first
⇓loop
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Arrow-Syntax (vereinfacht)
proc-Ausdrücke für komfortable Konstruktion von Arrows:
proc 〈input〉 → do〈output1〉 ← 〈arrow1〉 −[ 〈input1〉
......
〈outputn〉 ← 〈arrown〉 −[ 〈inputn〉returnA −[ 〈output〉
rec-Blöcke zur Darstellung von Arrows mit Zyklen
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Beispielcode: Eingabekomponente in Codebreaker(vereinfacht)
proc ()→ doguess ← guessInputField −[ ()sendReq ← addButton −[ isOk 〈$〉 guessreturnA −[ sample sendReq guess
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Umsetzung dynamischer Oberflächen
Dynamikkomponente:erhält zeitabhängige Collection von Komponenten als Eingabeenthält immer genau die Elemente der aktuellen Collection
Probleme bei der Verwendung von Signalen:linearer Zeitaufwand für Aktualisierungenkeine Elementidentitäten
Lösung durch spezielle Containersignal-Typen:gegenwärtig für Listen implementiert:
data ListSignal element
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Erzeugung elementarer Listensignale
Konstruktion durch Initalwert und Ereignisstrom mitÄnderungen:
listSignal :: [element ]→ EventStream (Change element)→ ListSignal element
data Change element = Addition Int element| Removal Int| Move Int Int
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Weitere Funktionen zur Arbeit mit Listensignalen(Auswahl)
elem :: element → ListSignal element → Signal Boollength :: ListSignal element → Signal Intreverse :: ListSignal element → ListSignal elementfilter :: (element → Bool)
→ (ListSignal element → ListSignal element)sort :: Ord element ⇒
ListSignal element → ListSignal element
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Deklarative GUI-ProgrammierungStatische OberflächenDynamische Oberflächen
Effizienz von Listensignalen
Platzaufwand: O(1) bzw. O(n log n)
Zeitaufwand:für Initialisierung: O(1) bzw. O(n log n)
für Aktualisierung: O(1), O(log n) bzw. O(
log2 n)
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Zusammenfassung
problemnahe Beschreibung von Oberflächen:Beschreibung zeitlicher Abläufe als zentrales KonzeptArrows und Arrow-Syntax zur Beschreibung der Interaktionvon Komponenten
trotzdem effiziente Umsetzung:datengetriebene Implementierung
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Ausblick
größere Auswahl an Komponentenweitere Containersignaltypenweitere AdapterModel-View-Controller-Prinzipsich kontinuierlich verändernde SignaleGrafik (animiert, ggf. interaktiv)Einbindung externer Objekte (z.B. Dateisystem)Klangsynthese
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit
EinführungGrapefruit im Detail
Abschluss
Schluss
weiterführende Ressourcen:Grapefruit-Homepage unterhttp://haskell.org/haskellwiki/GrapefruitKontaktierung des Autors [email protected]
Danke für die Aufmerksamkeit!Fragen?
Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit