Main project
Description and requirements
The goal of the main project is to develop an application or library using the concepts and techniques introduced in the lectures. More concretely, the project should:
- Be substantial: it should encompass several thousands lines of code;
- Tackle a real-world scenario, that is, it should have a useful application;
- Illustrate that you know how to apply concepts and techniques for the lectures;
- In particular, use strong types to develop a domain specific language to solve a particular problem;
- Showcase the best development practices that you have learned, include testing, profiling, and project management.
Deliverables
The project should be developed in teams of three people. The due dates can be found on the schedule.
Project proposal
The proposal is a 1 to 2-page document describing:
- The domain you will be working on.
- The problem or problems you library or application aims to solve.
- An estimated schedule for the project.
Status report
At the middle of the period you have to hand in a report (1 to 2 pages) describing the current status of your project:
- A concise description of the main data types and techniques you are using.
- Include a description of any libraries you are using.
- What you have achieved so far – a brief summary of what has been implemented.
- Please include a link to the repository containing the code.
- Timeline – are you still on track? How will you adapt your original timeline?
Presentation and final submission
Your final submission should contain the code and a small report (around 5 pages) outlining:
- A description of your domain and problem and how they translate to code.
- The most important concept and techniques used throughout the code.
- The results you have achieved, including examples of use of your library or application.
- Reflection about what went well or better than expected, and what problems you encountered.
Each team should prepare a small presentation (20 minutes, including questions) to describe the highlights of the project – both in terms of functionality and techniques – to the rest of the class.
Suggested topics
A few ideas for possible topics are included below – but this list is by no means exhaustive:
- A GitHub-like repo viewer, but fully in-browser and compatible with any
gitserver -
A unified CLI (or Haskell library) for git forge administration (replacing gh,glab,tea,fj)
- An Agda playground like the Agda pad, but fully in-browser
- A purely-functional port of the Muuri layout algorithm (for use with Iepje)
- An video game for the Iepje arcade
- A email client like sup (but easy to set up for UU-mail)
- A pure-Agda implementation of Data.Map, with benchmarks
- A computer geometry library with a purely functional implementation
-
A mermaid clone
- A library for data visualization and exploration, e.g. like d3 but not imperative
- A fully in-browser version of a useful data-viz script, e.g. find-cycles
- A Haskell build profiling tool to find which modules are slowing down
cabal build - A Haskell refactoring tool to split up big modules to speed up builds
- A Haskell refactoring tool to reorder modules to speed up builds
- A Haskell refactoring tool to split up big packages
-
An Agda development tool (e.g. sort imports)
- An Agda library for type-safe construction of nix derivations including exotic variants like content addressed derivations and computed derivations
- A library for numpy-style array operations, but strongly typed
- An interface (bindings or generator) to Dear ImGui
- An spreadsheet application like cryptpad or google sheets, fully in-browser
- A library for chemistry in the lines of chemlab, but strongly typed
- …