Grapefruit is a library for Functional Reactive Programming (FRP) with a focus on user interfaces. FRP makes it possible to implement reactive and interactive systems in a declarative style. With Grapefruit, user interfaces are described as networks of communicating widgets and windows. Communication is done via different kinds of signals which describe temporal behavior.
Grapefruit has the following important features:
- a push-based FRP implementation where signals
- can be memoized using ordinary variable bindings
- can be merged without doubling of simultaneous events
- cannot behave differently by starting them at different times
- a record system which makes it possible that
- input signals can be left out to get default behavior
- output signals can be left out to ignore uninteresting data
- output signals can be chosen and fetched by pattern matching
- an abstract UI implementation which can work with different backends which in turn use different toolkits to provide different look and feel with one and the same application code (At the moment, the only supported UI toolkit is GTK+ (via Gtk2Hs). We plan to support Qt in the future, making use of the HQK project’s output.)
You might be interested in a comparison of Grapefruit to other FRP libaries
Grapefruit is released on Hackage. If you do not have special requirements, you can install Grapefruit by saying
cabal install grapefruit-ui-gtk grapefruit-examples.
If you do not have installed the
gtk package yet, this command will also try to install this package. However, this will fail unless
gtk2hs-buildtools is already installed. See the Gtk2Hs website for further information.
Development versions can be fetched from the darcs repository at http://darcs.grapefruit-project.org/main. You can build them by building the individual Cabal packages in the
grapefruit-* directories. Note that
grapefruit-graphics is currently defunct.
Running the examples
You can run the examples by typing the following lines into GHCi:
run UIBackend mainCircuit ()
Example with the name of the example to run and
UIBackend with the name of the UI backend you want to use. At the moment, the only meaningful replacement for
GTK. Possible replacements for
We do not provide ready-to-use executables since it is possible (at least in theory) to run the examples with different UI backends and an executable would be fixed to a specific backend.
Publications and talks
The following publications and talks are related to Grapefruit:
- Wolfgang Jeltsch: Generic Record Combinators with Static Type Checking. 12th International Symposium on Principles and Practice of Declarative Programming. July 26–28, 2010.
- Wolfgang Jeltsch: A Generic Foundation for Record Combinators. 21st International Symposium on Implementation and Application of Functional Languages. September 23–25, 2009.
- slides (including non-shown additional material)
- Wolfgang Jeltsch: Signals, Not Generators!. Tenth Symposium on Trends in Functional Programming. June 2–4, 2009.
- Wolfgang Jeltsch: Declarative Programming of Interactive Systems with Grapefruit. Software Technology Colloquium of Universiteit Utrecht. May 29, 2008.
- Wolfgang Jeltsch: Improving Push-based FRP. Ninth Symposium on Trends in Functional Programming. May 26–28, 2008.
- Wolfgang Jeltsch: Funktionale GUI-Programmierung in Haskell mit Grapefruit. Haskell in Leipzig 2. July 10, 2007.
Below are some screenshots from the examples of the classic version. The Simple example is also available in the released version, along with several other examples not mentioned here.
- Clicking on the button adds a star to the caption of the button. This doesn’t look very meaningful. However, Simple is actually a very important example since it demonstrates that feedbacks work—the output of the button is transformed and then used as the button’s input.
- This is a Mastermind™-like game. The Add button is enabled if and only if the input field contains a valid code and the display box is enabled if and only if the list of guesses does not contain the code chosen by the computer. These properties are described in a declarative way in the source code.
- This example demonstrates Grapefruit’s support for animations.