Declarative Programming Of Interactive Systems With Grapefruit

Stc
Date: 2008-05-29

Time: 11:00

Room: BBL room 471

Speaker: Wolfgang Jeltsch (TU Cottbus)

Title: Declarative Programming of Interactive Systems with Grapefruit

Abstract

Functional programming languages are famous for supporting a declarative programming style where the program says what should be done instead how it should be done. However, GUI and graphics libraries of functional languages are typically imperative in nature. An example is the Haskell GTK+ binding Gtk2Hs. The programmer has to create widgets and windows explicitely and register event handlers. In turn, event handlers read the state of widgets and windows and modify the state of other widgets and windows depending on it.

Functional Reactive Programming (FRP) is a declarative programming model for reactive and interactive systems. Its key concept is the signal. A signal describes a part of the system’s behavior for all time. There are continuous signals which can be thought of as functions from times to values, and discrete signals which describe sequences of values which are related to discrete times. This can be illustrated with a push button in a GUI. The button’s caption is determined by a continuous signal of strings while the sequence of all push events is represented by a discrete signal over the unit type.

This talk presents the Grapefruit library, an implementation of FRP with a focus on GUI and graphics programming. With Grapefruit, user interfaces are described as systems of interconnected components which communicate via signals, and animated graphics are represented directly by signals. New signals can be composed from existing ones in a purely functional way by using a variety of combinator functions. User interfaces with changing structure are also supported and can also be described declaratively.

Previous Haskell FRP solutions are typically implemented in a pull-based way, meaning that an event occurence or time step results in the whole system state being recalculated. In contrast, Grapefruit uses a common notification mechanism based on event handlers internally so that unnecessary updates are usually avoided. This helps on making Grapefruit easy to use and efficient at the same time.