1
1
mirror of https://github.com/qfpl/applied-fp-course.git synced 2024-11-26 06:38:40 +03:00
applied-fp-course/README.md

107 lines
4.2 KiB
Markdown
Raw Normal View History

# Applied Functional Programming Course
2018-01-16 05:39:09 +03:00
[![Build Status](https://travis-ci.org/qfpl/applied-fp-course.svg?branch=master)](https://travis-ci.org/qfpl/applied-fp-course)
Updates based on course run feedback. Levels 3,4, and 5 have been reordered for a better flow and more constructive exercises. All levels should now build on GHC versions: {7.10.3, 8.0.2, 8.2.2} TravisCI integration added for GHC version build testing. Probably broke a whole bunch of things in the process. *sadface* Squashed commit of the following: commit 203a71de3b6df2525160e76622ce846053719ddf Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Tue Jan 16 12:33:23 2018 +1000 Updated instructor notes, added important section for things to mention/ask commit c8934debe9742d8ef7112ee661af7ebd3c58c7fa Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Tue Jan 16 12:14:24 2018 +1000 Attempt to fix weird doctest bug for level05 One more try at travis config for the time being. commit 85cd8a23d0d180bbd49dc5b4a40361c1bae3921d Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Tue Jan 16 11:59:08 2018 +1000 Deps updates and instructor notes added commit 7898c2294f9303b89e82dd95a9714cbf6546f9b4 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 21:20:55 2018 +1000 Removed import of Conf from Tests on level 03 commit 9c387e90ec4142bb02dd70bdee8752b7d5779c01 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 20:52:24 2018 +1000 Removed other cabal check, add FirstApp.Conf to level 3 exposed modules commit 2fe47b1cb46c240a9f5da6286af161724f334806 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 18:40:14 2018 +1000 Bump doctest bounds commit 7ede0c8b9f50fa12c6d240a9778672a75ad44bfe Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 18:16:53 2018 +1000 Added semigroups as a dependency commit 0d4c8e6539172487f9e2d239b74c8675ccf557dd Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 17:48:09 2018 +1000 CI Fixes - Remove sdist packaging test from travis.yml as we're not going to ever put these on hackage. - Move lower bound on time library out further for older GHCs. commit 20053d48780451edc8b8072bf23cfd3801935795 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 16:11:45 2018 +1000 Expanding notes commit 8d2e40012585828ede4ca8d506f71d504df690f9 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 15:55:30 2018 +1000 Expanded bounds for base & time to try to cover more GHC versions. Updated project paths in travis script commit d4cf006bed5cc925084a26afad159ef6442b1a4c Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 15:35:49 2018 +1000 Removed older GHC versions that won't be tested against for now commit 6543e1368ca179331ac25b141482b8cdb1a14d55 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 14:56:21 2018 +1000 Generated Travis.yml using multi-ghc-travis. Added tested-with setting to cabal files. Added cabal project file. commit b2ccf351abaebf62a33eef2f1f062eb081c31a29 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 14:34:52 2018 +1000 Updated Level 07 Use the new config structure. Expand the number of functions that need to be reworked because of the change to using ExceptT. Most involve copying previous answers, unsure if this will be a problem for people that aren't keeping up... commit 6628e221488c1ed16b06b759009a4d7613bba5ea Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 13:52:29 2018 +1000 Update Level06 Expand on what is to be completed in level 06 with respect to refactoring functions to run in a ReaderT. Added the new Conf structure commit 2cbc9ff269d3e204d340a266ab472d27fbf51e7e Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 10:59:30 2018 +1000 Some minor adjustments for levels 6 & 7, fell out of sequence of larger changes commit 3e964efc0b3c999930c2bfe8c69b13b63967da45 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 10:55:52 2018 +1000 Reordered Levels {3,4,5}. The new order is: 3) Testing (was #4) 4) Database (was #5) 5) Config (was #3) This flows better with an expected wind down into the testing level which is not very complex. Before increasing in difficulty again with the Database and then external config level. Still TODO: - Find what I missed when rewriting the parts of these levels that fell out of sync with the new ordering. - Update levels 6 & 7 to use the new configuraton structure from #5. commit 67451fffd23b06fe7ae24905c11b1e8e3b8bf279 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 09:03:46 2018 +1000 Fix time package version bound. Time version bound upped to 1.8.* for sqlite* packages. Stubbed out prepareAppReqs on level07. Removed lingering Table type on the db config. commit de7ba8c88c83b5a4cf898f9f882f60721d804b07 Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Mon Jan 15 08:45:41 2018 +1000 Apply latest round of changes from feedback. !DONE drop the "do your own thing" from the README regarding build environments !DONE notes about how to test the end points using CURL (4-5 requests, mix of okay & fail) !DONE move 'parseOptions' towards the bottom of the file (because we export it) !DONE add import of Data.Bifunctor (first) to Conf !DONE use 'try' instead of 'catch' for readObject !DONE add comments for some tests to write for the application !DONE - testing empty comments etc !DONE - make the test for helloMsg the last test !DONE change the instructions in the readme for level05 to go from DB/Types to Types to DB !DONE remove the Table name interpolation from the Level05 !DONE add the SQL into the functions for people. !DONE change the capitalisation of the Db/DB to be consistent across files (level05) !DONE fix instruction for modFieldLabel to not include camel-casing instructions !DONE add more information to the level05 Main.hs for 'prepareAppReqs' function. !DONE add explicit import for IOError (System.IO.Error) !DONE move the optparse-applicative out, students won't complete this section. Mention it as a thing to look at. !DONE Remove 'Conf.Conf' from 'handleRequest' from level >=5 !DONE Add instruction to the end of AppM to send people onwards to FirstApp/Main. !DONE Add type signatures to the functions in the where clause in the FirstApp/Main (level06) !DONE Add type signature to 'toStartUpErr' function in level07 !DONE !IMPORTANT! Remove/Fill in the 'flushTopic' function commit f40cf697fd7ea87ecf187ce3368ccfcde61cdadf Author: Sean Chalmers <sean.chalmers@data61.csiro.au> Date: Wed Jan 10 17:11:35 2018 +1000 Start trying to rearrange conf to be a bit more friendly
2018-01-16 05:36:57 +03:00
<img src="https://i.imgur.com/0h9dFhl.png" height="400" width="640" />
## * Beta Release *
This is a brand 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](https://freenode.net/) in #qfpl or #fp-course.
### You:
* Have completed, or are capable of completing, the [Data61 FP Course](https://github.com/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.
### 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.
2017-09-01 02:32:42 +03:00
### Setup build tools:
Each level is a self-contained Haskell application, containing incomplete, or as
yet undefined, data types and functions. There is a Cabal and Nix file for each
level, so you can use either cabal sandboxes or a ``nix-shell``, depending on
your preference.
To use a sandbox:
```bash
$ cd <levelN>
$ cabal sandbox init
$ cabal install --only-dependencies
$ cabal build
$ $EDITOR README.md
```
The normal cabal build commands should then work as expected. We do recommend
using cabal sandboxes as they provide a contained Haskell environment for a
given project. Easy to clean up, and package versions won't conflict with any
other sandboxed project you may be working on.
To use the Nix Shell:
```bash
$ cd <levelN>
$ nix-shell
$ cabal build
$ $EDITOR README.md
```
Once that completes you will be in a ``nix-shell`` environment with all the
tools required to build the application for that level. Note that the
levels build on each other, so you can go to the highest level and enter a
nix-shell there, you will then have all the required tools for every level.
The ``shell.nix`` is not provided, so if you have a different work-flow you can
utilise the derivation from the respective ``levelN.nix``.
##### 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](https://freenode.net). You can use the
free [WebChat client](https://webchat.freenode.net).
#### Subsequent lessons may contain spoilers, don't cheat yourself out of the experience!
There is a ``README.md`` file in each Level project that will provide instructions about
what the goal is for that specific level.
2017-08-10 09:25:08 +03:00
* Level 01 : Simple Hello World web app.
* Level 02 : Define our application spec with types!
* Level 03 : Add some flexible configuration
* Level 04 : Testing & Tools (hspec & ghcid)
2017-08-18 09:14:54 +03:00
* Level 05 : Database layer (sqlite-simple)
2017-08-10 09:25:08 +03:00
* Level 06 : ReaderT & Refactoring
* Level 07 : ExceptT & Refactoring
-- Coming Soon...
2017-08-10 09:25:08 +03:00
* Level 08 : (Bonus Round) Lenses & Refactoring
-- 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.
2017-08-08 02:45:19 +03:00