Project proposal
This is round one of your final project. Your job is to come up with a project proposal, a sketch of what you plan to do for the final project. The project itself will be due at the end of the semester, but this proposal will allow you to get feedback about your plans before you get started.
Proposal steps:
- Choose a partner
Like the last few homework assignments, you project should be done in pairs.
Having a partner for the project is required. With permission, a group of three people may work together.
- Choose a topic
The topic of your project should be something that you and your partner are interested in. Perhaps you would like to go deeper into one of the topics that we have covered in this course. Perhaps there is an algorithm or library or program that you have studied in a different course and would like to rewrite in Haskell.
Your project must have some sort of design element to it: whether it is designing a library, or an embedded language, or a new type class, or an application.
When choosing your application domain, browse this state of the Haskell ecosystem. You should choose a topic where Haskell excels (i.e. "Best in Class" or "Mature"). Topics in other domains generally lead to frustration and do not give you an opportunity to demonstrate what you have learned this semester. Your project also must connect to some of the topics that we are covering in class. You can write C-like code in Haskell, using the IO monad and imperative arrays, but we don't want to see that.
You should do some research on Hackage to see what libraries are already available for you to use. You can use any library that works with GHC 8.0.2. If there is already code on Hackage to do what you want to do, don't dispair. It is fine to extend, redesign, rethink, or even redo from scratch any of the existing packages. The only caveat is that you acknowledge all outside code and respect their licence agreements.
If you are stumped, I can give suggestions. Stick around after class, or if that is not convenient, send email to schedule a time.
Write a 2-3 page document including:
A one-paragraph description of the overall goal of your project.
A typical "use case" — i.e., an example showing how your program/library will behave under some typical usage scenario. (Include two or three different use cases if this makes sense.)
A sketch of how you plan to break the problem down into loosely coupled modular components. Your project should be comprised of more than one Haskell module.
Thoughts about how you might test the project. In particular, you should describe (informally) at least one quickcheck property that makes sense for (a part of) your project. If you cannot think of a property to check with quickcheck, then you may need to choose a different topic.
Submit your document (it must be called Proposal.txt) to the course website. Make sure that you include your name, your pennkey, your partner's name and your partner's pennkey at the top of the file.
Past successful projects
- Fractal drawing program, incuding DSL for L-Systems
- Number theory library, plus public-key cryptography application
- Theorem prover, using GADTs to represent proof system
- Regular expression library (including NFA and DFA conversion)
- Chess game
- Dominion game
- DSL for music generation
- DSL for drum beats
- Treap implementation (using GADTs to enforce invariants)
- Simple stack-based programming language