Advanced programming

Allikas: Kursused
(Ümber suunatud leheküljelt ITT8060)

Course code: ITT8060

Lecturers: Juhan Ernits, Wolfgang Jeltsch

Lab staff: Hendrik Maarand

Contact: NB! Mention ITT8060 in the subject line!

Time and place:

Lectures: Wednesdays 14:00, ICT-A1 U06A-201.

Labs: Wednesdays 16:00, U05-103.

Past editions: Advanced programming - 2015 Advanced programming 2014

You can download Visual Studio via the Microsoft DreamSpark program. You will need to register as a user at a local server [1] and then wait for an e-mail from Dreamspark. Students will have access to a wide range of Microsoft products for study purposes at no cost.

If you want to set up your development environment in a virtual machine, you are welcome to use the free VirtualBox or get a license of VMware Workstation via the VMware Academic Program. You will need to contact us at vmware at to gain access.

Installing F# tools on Linux is described here.

Installing F# tools on a Mac is described here.

For Dreamspark access please visit [2] and register an account.


Discussion group

The discussions should happen at the ITT8060 course page in You will need to use your TUT university account to get into that environment.

Important dates

The midterm test will take place on November 2 during the lecture. It will contribute up to 5% of your final exam mark. In case you have some serious reason why you cannot be present on November 2, you should let us know in writing by Monday, October 31st to


  • Tomas Petricek with Jon Skeet: Real-world functional programming with examples in F# and C#

- 10 copies at TUT: [3] - Several copies available in Tartu

- Electronic edition available at TUT library (TUT Uni-ID required for login) [4]

- several paper copies available in the ATI library in Tartu.

  • Additional textbook

Don Syme: Expert F#

- 5 copies at TUT: [5]

Lecture recordings

Lecture recordings are available in [6].

Lecture notes and courseworks

Task for the first lab:

You need your ID card or residence permit with a chip to sort out your access to the systems at TUT.

If you do not have and ID card or residence permit with a chip proceed as follows:

  • Learn your Uni-ID and set a password at the kind admins at room ICT-410. Write the Uni-ID down, because you will need it to submit your homeworks!
  • To get access to the study information system without a chip card, go to room SOC-132. (The Campus Map will help you find your way).

The rest of the tasks and lecture notes be available at under the course ITT8060.

The marks to courseworks are available at [7]. To log in use your as an e-mail address (it actually is an e-mail address as well!). Once logged in, please enroll to ITT8060.

Warning: you are required to solve the courseworks yourself. It is OK to ask questions in class and in the course forum, and discuss the problems with fellow students, but it is not OK to share solutions. If you get caught submitting somebody else's work, you and the person copied from will be penalised by receiving 0 marks and your act will be reported to the program manager. Repeated offence will result in losing your student status.

Lecture 1: Introduction. Basic concepts of F#

Recommended reading: Chapters 1-2 in RWFP, Chapter 1 in FPuF#.

Lecture 2: Tuples, lists, recursion. Functions as values

  • lecture2.fsx
  • coursework1.fsx (deadline Friday, September 23, submission to GIT. If your git repository does not appear to be present, e-mail to

Recommended reading: Chapter 3 in RWFP. Chapter 2-3 in FPuF#.

Lecture 3: Lists and recursion

  • lecture3.fsx
  • coursework2.fsx (deadline Friday, September 30, submission to GIT. If your git repository does not appear to be present, e-mail to

Recommended reading: Chapter 4 in FPuF#

Lecture 4: Discriminated unions and higher order functions

  • lecture4.fsx
  • coursework3.fsx (deadline Sunday, October 9, submission to GIT. If your git repository does not appear to be present, e-mail to

Recommended reading: Chapter 5-6 in RWFP. Chapter 5 in FPuF#

Lecture 5: Discriminated unions and higher order functions continued

Recommended reading: Chapter 5-6 in RWFP. Chapter 5 in FPuF#

Lecture 6: Behaviour centric programs

  • Recommended reading: End of Chapter 6, Chapter 8 in RWFP. Chapter 6 in FPuF#.

Lecture 7: Units of measure. Charting. Accessing CSV files with CsvFile and CSV type provider

Recommended reading: units of measure, FSharp.Charting, CsvFile, CSV type provider

Lecture 8: Property based testing: FsCheck

Recommended reading: FsCheck, QuickCheck (for Haskell)

Lecture 9: Accessing .Net libraries, implementing interfaces, Unit testing in F#

The whole project where NuGet dependencies get updated automatically during build (should also work in MonoDevelop / Xamarin Studio): Note that the problems that showed up at the end of the lecture are fixed.

Recommended reading: Chapter 11 in RWFP

Lecture 10: Efficiency of data structures. Tail recursion

Coursework 7 submission deadline: Friday, November 18.

Recommended reading: Chapter 10 in RWFP, Chapter 9 in FPuF#

Lecture 11: Sequences and computation expressions

  • NB! Bonus coursework B is changed to coursework8! The deadline is December 2 and you will

coursework8.fsx Deadline: December 2, 2016. This courswork will give max 5 points.

Recommended reading: RWFP: Pages 314 - 350. FPuF#: Chapter 11 (sequences) and Chapter 12 (computation expressions)

Lecture 12: F# for the web: compiling F# to JavaScript with Fable

The source of the sample used in class: [9]

NB! To get the sample working, it is necessary to install NodeJS

Lecture 13: Asynchronous computations and reactive programming

Recommended reading: Chapter 13 in RWFP. Chapter 13 in FPuF#. FSharp.Control.Reactive (RX)

Lecture 14: Data analysis with FsLab

To build the output first go to .paket subdirectory and run paket.bootstrapper.exe (mono packet.bootstrapper.exe in Linux/OSX).

Then go to the root of the journal project and call build (either build.cmd in Windows or in Linux OSX). This will ensure all dependencies are present and call the runner that will do the parsing of the journal.

Lecture 15

Parallel computations in F#: lecture15_parallel.fsx

In the second part of the lecture we looked at F# implementation of the following Monte Carlo simulatin algorithm: [10]

The F# implementation is here: lecture15_monte_carlo.

Submission of courseworks

(From week 2)

You are required to upload courseworks to a GIT repository provided by the university. The URL of the GIT repository is (please note that this cannot be accessed over a browser, it has to be accessed by a GIT client, either from or elsewhere)

You should be able to clone the empty repository by running the following command

git clone

First time submission

To submit the courseworks the first time you should create appropriate subdirectories into the freshly cloned directory. For example, if your name is John Doe and your TUT Uni-ID user name is jodo, then you would run the following commands from Git Bash:

To set your user details:

git config --global "John Doe"
git config --global

To clone the repository and copy courseworks into it:

git clone
cd jodo
mkdir coursework1

NB! Note that there is no web access to your repository. Also the permissions have been pre-configured for you.

Now copy coursework1.fsx into the newly created directory "coursework1" and run

git add coursework1/coursework1.fsx

To commit a logical set of changes you run commit:

git commit -a

Your default text editor will be Vi unless your settings say otherwise. To make it easier, Esc + : + x saves and exits, Esc + : + q! quits without saving (note that + is a separator, i.e. you should not type +)

To upload the contents to the server run

git push origin master

NB! Remember to replace jodo with your own TUT UNI-ID username which you can find out from [11] if you have an ID card or residence permit, or from the kind admins in room ICT-410!

Submission of additional files to a non-empty repository

Once you have successfully submitted your first homework, you will be asked to submit further homeworks to the same repository.

We assume that you have a local copy of the repositori in directory called "myrepo". You can always clone a fresh copy by running the following command from Git Bash:

git clone mylocalrepodir

This command is also useful to check if your submission of homeworks has been useful. Just replace "mylocalrepodir" with some temporary directory to check what got uploaded to the GIT server.

When you modify a file that is already registered with git, e.g. you modify the coursework that you already committed and pushed, the only thing you need to do is commit the modifications and push them again.

The following assumes that you have a local copy of the repo and you have changed directory into that repository by running e.g.

cd mylocalrepodir

For example, you modified coursework1/coursework1.fsx and want to upload the modifications. What you need to do is to commit the changes:

git commit coursework1/coursework1.fsx -m "Description of the modifications"

And then, to upload the changes to the server by running

git push

To add new files, e.g. coursework2.fsx, you will need to run the "git add" command after copying the new file to the appropriate location in the myrepo directory:

git add coursework2/coursework2.fsx
git commit coursework2/coursework2.fsx -m "Some message describing the commit"
git push

NB! Never attempt to add directories. Git figures directories out automatically, you can only add files that have been already placed in appropriate directories.

If you run "git commit" without the "-m" switch, you will be prompted with the default text editor in your system. If you are using Git Bash, the editor tends to be Vim. Look at the Vi reference card for survival tips.

Issues regarding the repository access should be reported to

If git seems to be doing something different from what you expect it to do, check what state it is in by running in myrepo

git status

The output will show which files are tracked and which are not. To track untracked files add them by "git add". If you accidentally added some files you do not want to be tracked, run "git rm file-not-to-be-tracked".

To see the history of commits in the repository, run

git log

You can also visualise the history by running


Further info available in the Git book.