1
1
mirror of https://github.com/qfpl/applied-fp-course.git synced 2024-11-22 11:23:01 +03:00
Applied Functional Programming Course - Move from exercises to a working app!
Go to file
Sean Chalmers b8921cd1aa
the bonnet is up and we're on bricks. Fix it. (#71)
* Add shell.nix that includes sqlite.

previous shell environment didn't include an application that was necessary for
developing the application. Whoops.

This new shell.nix lets students add their own development tools if they want
to try something out. `ghcid` for example.

* Overhaul: New techniques, new exercises.

Remove hspec-wai dependencies, add waargonaut.

The aeson dependency has been replaced with waargonaut, and the exercises have
been updated to match. Some exercises have been removed.

Add the use of `finally` as a demonstration and reminder that we should be
cleaning up things like connections when an app is done.

Explain the purpose of the `runDB` function so that implementation makes more
sense to students as an exercise.

Add exercise to generalise the error type that is used in the `AppM` transformer
that they implement. This flows onto a later exercise where they reuse this type
to simplify a function that is not part of the core application. This also
allows for an easier introduction of `ExceptT` as an exercise later in the
course when `AppM` is no longer usable.

Add a startup error constructor as making the students add it isn't informative
when compared to the rest of the exercise.

* Remove all duplicate tests. Rebuild Level03.

Level03 has been changed entirely to be centered on writing tests for student
code. The tests are then to be updated by the students as they progress through
the course. There are no duplicated tests and there is a bit more incentive for
students to get in and get their hands dirty with respect to testing their own
work.

Still not sure what to do with doctests just yet. More documentation is required
for that.

* Remove Level03 exe and modules.

* Feedback driven development

* Add tighter bounds for lens.
* Add bounds for old-locale and contravariant.
* Realign some imports.
* Rename 'AppM'' to 'AppM' and 'AppM' to 'App'.
* Clean up an utterly misleading and out of date comment regarding configuration
  package choices. Revert to unremarkable statement about it being JSON.
* Remove redundant import of `Level02.Types` from `tests/Test.hs`.
* Add waargonaut to extra-deps in stack.yaml.
* Bump LTS in stack.yaml to 12.14.
* Fix typos.
* Improve wording, restructure some comments.

* Revert LTS bump, increase contravariant upper bound for GHC 8.6.1

* Try updated stack.yaml

* Update travis.yml:

Bump patch versions of GHC:

* 8.4.3 -> 8.4.4
* 8.6.1 -> 8.6.2

Drop Stack LTS:

6, 9, 10

Add Stack LTS:

11, 12

* Add fixes to help stack nightly builds on travis. Remove some comments in cabal file

* Remove LTS-11, add in-memory db notes to level04

* add workshop levels document for expansion

* Proofread changes.

* Try to use cached GHC downloads for stack on travis

* Remove install ghc flag from stack commands

* Last try to stop stack downloading its own GHC

* Revert stack travis changes. Attempt to pin appar version for 7.10.3.

* Drop support for GHC 7.10.3
2018-12-07 10:16:13 +10:00
exe the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
files dbName: firstapp -> app_db.db 2018-11-29 14:06:03 +10:00
nix the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
src the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
tests the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
.gitignore Add new line before app_db.db 2018-11-29 14:04:31 +10:00
.travis.yml the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
applied-fp-course.cabal the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
applied-fp-course.nix the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
cabal.project Full Course Layout Change with a shuffle. (#54) 2018-05-08 09:02:51 +10:00
changelog.md Full Course Layout Change with a shuffle. (#54) 2018-05-08 09:02:51 +10:00
default.nix the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
FUTURE_PLANS.md Issue Fixes & More feedback driven development 2018-01-22 11:40:11 +10:00
INSTRUCTOR_NOTES.md Updated instructor notes. 2018-05-09 13:51:39 +10:00
LICENCE Added LICENCE in accordance with CoC 2017-09-12 11:46:04 +10:00
README.md the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
shell.nix the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00
stack.yaml the bonnet is up and we're on bricks. Fix it. (#71) 2018-12-07 10:16:13 +10:00

Applied Functional Programming Course

Build Status

This is a new course, so there are going to be rough edges. We invite you to submit issues or pull requests if you find errors or have suggestions on how to improve it.

This course is designed to be run in a class room with instructors, but we would like to make it suitable for self-study as well. Although undertaking this course outside of the workshops will increase the difficulty somewhat, we do not discourage it and invite suggestions on how to make the course more approachable.

If you do attempt this on your own and find yourself completely lost, then you may come find us on IRC on Freenode in #qfpl or #fp-course.

You:

  • Have completed, or are capable of completing, the Data61 FP Course.
  • Have a few months self-study to your name.
  • Want to know how to build larger applications with statically typed FP.
  • Are willing to accept that a web application is a sufficient choice.
  • Can write the canonical function of type: Applicative f => [f a] -> f [a]

We:

  • Have constructed a sequence of goals of increasing difficulty.
  • Have provided a framework within which to apply these goals.
  • Have included relevant components of larger applications:
    • Package dependencies
    • Project configuration
    • Application testing & building
    • Encoding / Decoding messages (JSON & Binary)
    • Persistent storage integration
    • App state & configuration management
    • Error handling & reporting
  • Will utilise both type & test driven development techniques.
  • Will explain architectural and design trade-offs when appropriate.

Setup build tools:

Each level is a self-contained Haskell module, containing incomplete, or as yet undefined, data types and functions.

We recommend using either a cabal sandbox, or a nix-shell, depending on your preference.

Cabal

If you're using a version of Cabal that is >=2.0 (use cabal --version to find out), then you can use the new-* commands and you don't need a sandbox:

$ cd path/to/applied-fp-course
$ cabal new-configure --enable-tests
$ cabal new-build <levelN>-exe
$ $EDITOR src/<LevelN>/README.md

If you don't have a version of Cabal that is >=2.0 then we recommend using cabal sandboxes. They provide a contained Haskell environment for a given project. They're also easy to clean up and any installed packages won't conflict with any other sandboxed project you may be working on.

$ cd path/to/applied-fp-course
$ cabal sandbox init
$ cabal install --only-dependencies --enable-tests
$ cabal build
$ $EDITOR README.md

To delete a sandbox:

$ cd path/to/applied-fp-course
$ cabal sandbox delete

Nix

If you would like to use a Nix Shell:

$ cd path/to/applied-fp-course
$ nix-shell
$ cabal new-build <levelN>-exe
$ $EDITOR src/<LevelN>/README.md

Once that completes you will be in a nix-shell environment with all the tools required to work through the course.

Stack

Stack yaml configuration is provided and checked by our CI system for successful builds. However the authors do not use stack, so we cannot promise to be able to resolve stack related issues that may arise. Though we will do our best. :)

Please note...

These lessons are designed to be completed with an instructor as part of the Data61 Applied Functional Programming Course. You are of course welcome to clone the repository and give it a try, but you may find the tasks more difficult. If you have any questions we can be contacted in the Freenode #qfpl or #fp-course IRC channel. You can use the free WebChat client.

Subsequent lessons may contain spoilers, don't cheat yourself out of the experience!

There is a README.md file in each Level module folder that will provide instructions about what the goal is for that specific level.

  • Level 01 : Simple hello world web app.
  • Level 02 : Define our application spec with types!
  • Level 03 : Testing & tools
  • Level 04 : Database layer (sqlite-simple)
  • Level 05 : Better error handling through ExceptT
  • Level 06 : Add some flexible configuration
  • Level 07 : ReaderT & refactoring

-- In Development...

  • Level 08 : Lenses & "classy mtl" monad transformers

-- Maybe...

  • Level 09 : Add session controls (login, logout) and a protected route. So we can have something that resembles application state. For the purposes of modelling the state machine and implementing some property based tests.