24
Einführung Grapefruit im Detail Abschluss Funktionale GUI-Programmierung in Haskell mit Grapefruit Wolfgang Jeltsch Brandenburgische Technische Universität Cottbus Lehrstuhl Programmiersprachen und Compilerbau Haskell in Leipzig 2, Juli 2007 Wolfgang Jeltsch Funktionale GUI-Programmierung in Haskell mit Grapefruit

Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 2: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 3: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 4: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 5: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 6: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 7: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 8: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 9: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 10: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 11: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 12: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 13: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 14: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 15: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 16: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 17: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 18: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 19: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 20: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 21: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 22: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 23: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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

Page 24: Funktionale GUI-Programmierung in Haskell mit Grapefruit · Rein funktionale GUI-Programmierung Forschung zu rein funktionaler GUI-Programmierung seit über 15 Jahren viele Bibliotheken:

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