# Functional Programming with OCaml

- Institution: IIT Madras
- Department: Computer Science and Engineering
- Teacher: Prof. K C Sivaramakrishnan
- Level: Undergraduate
- Language: English
- Subjects: Computer science, Engineering
- Source: [NPTEL](https://nptel.ac.in/courses/106106002)
- Licence: [CC BY-NC-SA](https://nptel.ac.in/faq) (Non-commercial use only.)
- Syllabus: [at the source](https://nptel.ac.in/courses/106106002)
- Who can watch: Tweens profiles and older (sources give no ratings; placed by Invisible Network from the source's own words)

This course introduces the principles of functional programming using OCaml, with a strong emphasis on building reliable and secure software systems. It covers core concepts such as higher-order functions, type systems, and modular design, along with advanced topics like concurrency and memory safety. Through hands-on programming assignments and projects, learners will gain practical experience in writing robust systems software using modern functional programming techniques.

The interactive course book is available at: https://fplaunchpad.org/ocaml_nptel/

Intended audience: • Undergraduate and postgraduate students in Computer Science and related disciplines. • Systems engineers, software developers, and researchers. • Professionals interested in secure and reliable software development. • Any interested learners.

Prerequisites: C Programming, Data structures and Algorithms

## Lectures

1. [Course introduction: what you'll learn, how it's run](https://invisiblenetwork.ai/learn/nptel/106106002/1c4eb352579b) (YouTube)
2. [Why functional programming?](https://invisiblenetwork.ai/learn/nptel/106106002/67ecb677ff6e) (YouTube)
3. [A tour of OCaml: values, types, and the toplevel](https://invisiblenetwork.ai/learn/nptel/106106002/7b435119c129) (YouTube)
4. [Your first OCaml program: hello, world (and beyond)](https://invisiblenetwork.ai/learn/nptel/106106002/5e944eb861e1) (YouTube)
5. [Tutorial: temperature conversions and small expressions](https://invisiblenetwork.ai/learn/nptel/106106002/b29955cc1eb6) (YouTube)
6. [Literals: integers, floats, booleans, strings](https://invisiblenetwork.ai/learn/nptel/106106002/d4ec4d988754) (YouTube)
7. [`let` bindings and shadowing](https://invisiblenetwork.ai/learn/nptel/106106002/701840131c9e) (YouTube)
8. [Static vs dynamic semantics, and type inference](https://invisiblenetwork.ai/learn/nptel/106106002/45ca753f9b5e) (YouTube)
9. [Operators, precedence, and common pitfalls](https://invisiblenetwork.ai/learn/nptel/106106002/f23f74e38680) (YouTube)
10. [`if`/`then`/`else` as an expression](https://invisiblenetwork.ai/learn/nptel/106106002/b34765524e38) (YouTube)
11. [Tutorial: small expressions, end to end](https://invisiblenetwork.ai/learn/nptel/106106002/5cf585a6c9f1) (YouTube)
12. [Functions as values, and anonymous functions](https://invisiblenetwork.ai/learn/nptel/106106002/a5aec184e5a8) (YouTube)
13. [Recursion](https://invisiblenetwork.ai/learn/nptel/106106002/5838d2292f89) (YouTube)
14. [Currying and partial application](https://invisiblenetwork.ai/learn/nptel/106106002/494a9110eaeb) (YouTube)
15. [Tail recursion and accumulators](https://invisiblenetwork.ai/learn/nptel/106106002/e7f2da823dd8) (YouTube)
16. [Local functions and mutual recursion](https://invisiblenetwork.ai/learn/nptel/106106002/9030af39353e) (YouTube)
17. [Tutorial: Fibonacci, GCD, power, digits](https://invisiblenetwork.ai/learn/nptel/106106002/84a6188c9fdd) (YouTube)
18. [Tuples](https://invisiblenetwork.ai/learn/nptel/106106002/5d048f6adb5b) (YouTube)
19. [Records](https://invisiblenetwork.ai/learn/nptel/106106002/3c25e98ddf2d) (YouTube)
20. [Variants (sum types)](https://invisiblenetwork.ai/learn/nptel/106106002/e2a4cd7787bf) (YouTube)
21. [Recursive types: lists, trees, expressions](https://invisiblenetwork.ai/learn/nptel/106106002/262f752124fc) (YouTube)
22. [Tutorial: a tiny AST for OCaml](https://invisiblenetwork.ai/learn/nptel/106106002/04b300dc2d1a) (YouTube)
23. [Tutorial: a tiny file system](https://invisiblenetwork.ai/learn/nptel/106106002/a57c30a3b42b) (YouTube)
24. [Basic patterns: literals, variables, wildcards](https://invisiblenetwork.ai/learn/nptel/106106002/061314a76c34) (YouTube)
25. [Pattern matching on lists and trees](https://invisiblenetwork.ai/learn/nptel/106106002/d2e16ca6b500) (YouTube)
26. [Nested patterns and or-patterns](https://invisiblenetwork.ai/learn/nptel/106106002/4c74d6c5fe75) (YouTube)
27. [Guards: when-clauses on patterns](https://invisiblenetwork.ai/learn/nptel/106106002/d38c9f1f38a7) (YouTube)
28. [Exhaustiveness checking](https://invisiblenetwork.ai/learn/nptel/106106002/c7bb81d4f05f) (YouTube)
29. [Tutorial: an interpreter for the OCaml AST](https://invisiblenetwork.ai/learn/nptel/106106002/5a2952c4a4c8) (YouTube)
30. [Functions as values, revisited](https://invisiblenetwork.ai/learn/nptel/106106002/f602f76a9f10) (YouTube)
31. [map: transform every element](https://invisiblenetwork.ai/learn/nptel/106106002/c7ca747b719d) (YouTube)
32. [filter: keep what passes the predicate](https://invisiblenetwork.ai/learn/nptel/106106002/d44929eef512) (YouTube)
33. [fold: reduce a list to a single value](https://invisiblenetwork.ai/learn/nptel/106106002/791c3a88324b) (YouTube)
34. [Function composition and pipelines](https://invisiblenetwork.ai/learn/nptel/106106002/d4820141e4b7) (YouTube)
35. [Tutorial: fold across data structures](https://invisiblenetwork.ai/learn/nptel/106106002/2921bd0a23a5) (YouTube)
36. [Mutable references](https://invisiblenetwork.ai/learn/nptel/106106002/bb939cb2a575) (YouTube)
37. [Mutable records and arrays](https://invisiblenetwork.ai/learn/nptel/106106002/47ee3377a2aa) (YouTube)
38. [Exceptions](https://invisiblenetwork.ai/learn/nptel/106106002/d30d51894e5a) (YouTube)
39. [Streams and Laziness](https://invisiblenetwork.ai/learn/nptel/106106002/fa3008c9e013) (YouTube)
40. [Memoization](https://invisiblenetwork.ai/learn/nptel/106106002/caa6ccc5f08f) (YouTube)
41. [Module basics](https://invisiblenetwork.ai/learn/nptel/106106002/7231a944ba0b) (YouTube)
42. [Module signatures](https://invisiblenetwork.ai/learn/nptel/106106002/ab1b192ff730) (YouTube)
43. [Functors](https://invisiblenetwork.ai/learn/nptel/106106002/4b823c2a881c) (YouTube)
44. [Tutorial: A Queue functor](https://invisiblenetwork.ai/learn/nptel/106106002/94036e09e20f) (YouTube)
45. [The option monad and `let*`](https://invisiblenetwork.ai/learn/nptel/106106002/628426a3db26) (YouTube)
46. [Monad laws, the list monad, and the result monad](https://invisiblenetwork.ai/learn/nptel/106106002/d594c4144f82) (YouTube)
47. [The state monad and parameterised state](https://invisiblenetwork.ai/learn/nptel/106106002/4c4622216a62) (YouTube)
48. [GADTs: variants with type-level information](https://invisiblenetwork.ai/learn/nptel/106106002/f025e7f97bc4) (YouTube)
49. [GADTs: use cases beyond toy interpreters](https://invisiblenetwork.ai/learn/nptel/106106002/1c31ec6cd266) (YouTube)
50. [GADTs: hlists and witnesses](https://invisiblenetwork.ai/learn/nptel/106106002/08e496063e92) (YouTube)
51. [Tutorial: a tiny well-typed evaluator](https://invisiblenetwork.ai/learn/nptel/106106002/538582d7c237) (YouTube)
52. [Why test a type-safe program?](https://invisiblenetwork.ai/learn/nptel/106106002/751bfa834aad) (YouTube)
53. [Specifications and invariants](https://invisiblenetwork.ai/learn/nptel/106106002/f13ba5291f9f) (YouTube)
54. [Designing test cases: black-box and glass-box](https://invisiblenetwork.ai/learn/nptel/106106002/2718c4ad3b31) (YouTube)
55. [Unit testing](https://invisiblenetwork.ai/learn/nptel/106106002/78611c076a1e) (YouTube)
56. [Property-based testing with QCheck](https://invisiblenetwork.ai/learn/nptel/106106002/9764c47e0e1b) (YouTube)
57. [Model-based testing of stateful data structures](https://invisiblenetwork.ai/learn/nptel/106106002/619388ec144a) (YouTube)
58. [Tutorial: testing the expr evaluator with OUnit2 and QCheck](https://invisiblenetwork.ai/learn/nptel/106106002/2f9fd589f404) (YouTube)
59. [What memory safety is, and why it is a security story](https://invisiblenetwork.ai/learn/nptel/106106002/2108c9899b12) (YouTube)
60. [Memory safety by construction](https://invisiblenetwork.ai/learn/nptel/106106002/9fc815d48756) (YouTube)
61. [Data races are undefined behaviour](https://invisiblenetwork.ai/learn/nptel/106106002/a28c5a3a5273) (YouTube)
62. [Where OCaml itself has UB](https://invisiblenetwork.ai/learn/nptel/106106002/a6bd3b0ddab1) (YouTube)
63. [Tutorial: walking Heartbleed end to end](https://invisiblenetwork.ai/learn/nptel/106106002/22fcb262f320) (YouTube)
64. [Locality: safe stack allocation](https://invisiblenetwork.ai/learn/nptel/106106002/01640545bff1) (YouTube)
65. [Uniquenss: the only reference](https://invisiblenetwork.ai/learn/nptel/106106002/4ae06280b15d) (YouTube)
66. [Linearity: use at most once](https://invisiblenetwork.ai/learn/nptel/106106002/b01134f1fc6c) (YouTube)
67. [Contention: Synchronisation at compile time](https://invisiblenetwork.ai/learn/nptel/106106002/116f3af48da9) (YouTube)
68. [Portability: data race freedom across domains](https://invisiblenetwork.ai/learn/nptel/106106002/27bd8d90f3ff) (YouTube)
69. [Tutorial: a resource-management API](https://invisiblenetwork.ai/learn/nptel/106106002/fc73b34c4762) (YouTube)
70. [Why do we need an OS?](https://invisiblenetwork.ai/learn/nptel/106106002/6cf938999a09) (YouTube)
71. [MirageOS Unikernel Background](https://invisiblenetwork.ai/learn/nptel/106106002/5ce98f7317a7) (YouTube)
72. [MirageOS Basics](https://invisiblenetwork.ai/learn/nptel/106106002/8e0ad9154b76) (YouTube)
73. [Suresh the Stationmaster: a worked unikernel example](https://invisiblenetwork.ai/learn/nptel/106106002/1185a5c272bc) (YouTube)
