<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: david2am</title>
    <description>The latest articles on Forem by david2am (@david2am).</description>
    <link>https://forem.com/david2am</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F544667%2Fff229d9f-1572-49ca-8f07-5af8d3c332bb.jpeg</url>
      <title>Forem: david2am</title>
      <link>https://forem.com/david2am</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/david2am"/>
    <language>en</language>
    <item>
      <title>OCaml in 5 Minutes: From Zero to 'Hello'</title>
      <dc:creator>david2am</dc:creator>
      <pubDate>Fri, 14 Nov 2025 16:32:34 +0000</pubDate>
      <link>https://forem.com/david2am/ocaml-in-5-minutes-from-zero-to-hello-42mm</link>
      <guid>https://forem.com/david2am/ocaml-in-5-minutes-from-zero-to-hello-42mm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Tired of the OCaml setup rabbit hole?&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;In 5 minutes, you’ll have a fully working OCaml project.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Just copy, paste, run.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Global Setup&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install OCaml&lt;/li&gt;
&lt;li&gt;
Install Platform Tools &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Create a New Project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new project&lt;/li&gt;
&lt;li&gt;Create a Switch&lt;/li&gt;
&lt;li&gt;Configure Git&lt;/li&gt;
&lt;li&gt;
Run the Project
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
Next Steps
&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🟣 Global Setup
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Install OCaml
&lt;/h2&gt;

&lt;p&gt;Start by installing &lt;strong&gt;Opam&lt;/strong&gt;, the OCaml package manager, which is similar to &lt;strong&gt;npm&lt;/strong&gt; in JavaScript. It manages packages and compiler versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  For macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;opam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  For Linux
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;opam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Initialize OCaml's global configuration:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opam init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Load Opam's Environment:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;opam &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Consider adding &lt;code&gt;eval $(opam env)&lt;/code&gt; command to your &lt;code&gt;.bashrc&lt;/code&gt; or &lt;code&gt;.zshrc&lt;/code&gt; file to automate this process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Install Platform Tools
&lt;/h2&gt;

&lt;p&gt;Install tools to assist you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opam &lt;span class="nb"&gt;install &lt;/span&gt;ocaml-lsp-server odoc ocamlformat utop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ocaml-lsp-server&lt;/code&gt;: editor integrations (VS Code, Neovim, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;odoc&lt;/code&gt;: documentation generator&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ocamlformat&lt;/code&gt;: automatic code formatter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utop&lt;/code&gt;: improved OCaml REPL&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🟣 Create a New Project
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Dune&lt;/strong&gt; is OCaml's default build system, it helps you create and manage projects. &lt;/p&gt;

&lt;h2&gt;
  
  
  Create a new project
&lt;/h2&gt;

&lt;p&gt;Dune is already installed by the platform tools so just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dune init proj my_project
&lt;span class="nb"&gt;cd &lt;/span&gt;my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your project structure will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_project/
├── lib/
│   └── dune
├── bin/
│   ├── main.ml
│   └── dune
├── test/
│   └── test_my_project.ml
├── dune-project
└── my_project.opam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lib/&lt;/code&gt;: contains your modules (&lt;code&gt;.ml&lt;/code&gt; files).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bin/&lt;/code&gt;: contains your &lt;code&gt;main.ml&lt;/code&gt; alias your runnable app file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;test/&lt;/code&gt;: contains your tests.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dune-project&lt;/code&gt;: it's the equivalent to &lt;code&gt;package.json&lt;/code&gt; in JavaScript or &lt;code&gt;requirements.txt&lt;/code&gt; in Python.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bin/main.ml&lt;/code&gt;: the application’s entry point.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of your work will happen in the &lt;code&gt;lib/&lt;/code&gt; folder, and the &lt;code&gt;main.ml&lt;/code&gt; file. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Create a Switch
&lt;/h2&gt;

&lt;p&gt;Switches in OCaml are similar to Python's virtual environments. They isolate compilers and package versions from other projects or global configurations.&lt;/p&gt;

&lt;p&gt;Create a switch with a compiler version (5.3.0 in this example):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opam switch create &lt;span class="nb"&gt;.&lt;/span&gt; 5.3.0 &lt;span class="nt"&gt;--deps-only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command creates and stores switch artifacts in the &lt;code&gt;_opam/&lt;/code&gt; folder. The &lt;code&gt;--deps-only&lt;/code&gt; flag ensures that only dependencies are installed, and not the current project been taken as another dependency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to know the available compiler versions run this command and pick one:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;opam switch list-available
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Activate the Switch
&lt;/h3&gt;

&lt;p&gt;Run at your project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;opam &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Dev Tools for the Switch
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opam &lt;span class="nb"&gt;install &lt;/span&gt;ocaml-lsp-server odoc ocamlformat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Enable Automatic Switch Detection
&lt;/h4&gt;

&lt;p&gt;You only need to run this command once, it enables automatic switch detection when moving from one OCaml project to another:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;opam init &lt;span class="nt"&gt;--enable-shell-hook&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configure Git
&lt;/h2&gt;

&lt;p&gt;Dune projects do not include a &lt;code&gt;.gitignore&lt;/code&gt; file by default. Create it manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .gitignore&lt;/span&gt;
_opam/
_build/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Initialize Git
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Run the Project
&lt;/h2&gt;

&lt;p&gt;Compile and execute your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dune build
dune &lt;span class="nb"&gt;exec &lt;/span&gt;my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, use watch mode to accomplish both commands in one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dune &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voilà you will see this hello world message in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Hello, World!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you wonder where this code lives go to the &lt;code&gt;lib/&lt;/code&gt; folder and open the &lt;code&gt;main.ml&lt;/code&gt; file and you will see it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* lib/mail.ml *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;print_endline&lt;/span&gt; &lt;span class="s2"&gt;"Hello, World!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Congratulations! You have created your first OCaml/Dune project!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy coding with OCaml! 🚀&lt;/p&gt;




&lt;h1&gt;
  
  
  Next Steps
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Did this help?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give it a ❤️&lt;/li&gt;
&lt;li&gt;Follow for &lt;strong&gt;Part 2: &lt;a href="https://dev.to/david2am/ocamldune-modules-libraries-like-js-but-better-4fn"&gt;OCaml Modules and Libraries&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If you want to dig into OCaml I wrote &lt;a href="https://dev.to/david2am/basic-ocaml-2j0g"&gt;Basic OCaml&lt;/a&gt; and its second part &lt;a href="https://dev.to/david2am/practical-ocaml-1h71"&gt;Practical OCaml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Share with one friend learning systems programming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Have a question? Comment below — I reply to all!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ocamlverse.net/content/quickstart_ocaml_project_dune.html" rel="noopener noreferrer"&gt;OCamlVerse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dune.readthedocs.io/en/stable/tutorials/developing-with-dune" rel="noopener noreferrer"&gt;Dune Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ocaml</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>learning</category>
    </item>
    <item>
      <title>OCaml Modules &amp; Libraries (Like JS but Better)</title>
      <dc:creator>david2am</dc:creator>
      <pubDate>Fri, 14 Nov 2025 16:25:55 +0000</pubDate>
      <link>https://forem.com/david2am/ocamldune-modules-libraries-like-js-but-better-4fn</link>
      <guid>https://forem.com/david2am/ocamldune-modules-libraries-like-js-but-better-4fn</guid>
      <description>&lt;p&gt;Tired of the OCaml setup rabbit hole?&lt;/p&gt;

&lt;p&gt;In 5 minutes, you’ll build your first OCaml program.&lt;/p&gt;

&lt;p&gt;Just copy, paste, run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use Modules and Libraries&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a Module&lt;/li&gt;
&lt;li&gt;Create a dune File&lt;/li&gt;
&lt;li&gt;Register a Library&lt;/li&gt;
&lt;li&gt;
Use a Library &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Create an Interface File  &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
Next Steps
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🟣 Use Modules and Libraries
&lt;/h1&gt;

&lt;p&gt;Let's add some modules, interface files, tests, and more!&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Module
&lt;/h2&gt;

&lt;p&gt;In OCaml the concept of module is similar to the one in Python or JavaScript where every file is considered an independent unit of work with its own namespace.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;calc.ml&lt;/code&gt; file in the &lt;code&gt;lib/&lt;/code&gt; folder and add the following functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* lib/calc.ml *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create a dune File
&lt;/h2&gt;

&lt;p&gt;In Dune it's not enough to create a file to use it as a module, you need to explicitly say it through adding metadata in a &lt;code&gt;dune&lt;/code&gt; file. &lt;/p&gt;

&lt;p&gt;But before setting the metadata it's important to differentiate between a module and a library in OCaml:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Module = single unit of code organization. They form what it's called a compilation unit, a fully independent program from the compiler's perspective&lt;/li&gt;
&lt;li&gt;Library = packaged collection of modules for distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this occasion you will define everything inside the &lt;code&gt;lib/&lt;/code&gt; folder as a library named &lt;code&gt;math&lt;/code&gt; so you could later call the &lt;code&gt;Calc&lt;/code&gt; module through it.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;dune&lt;/code&gt; file in &lt;code&gt;lib/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scheme"&gt;&lt;code&gt;&lt;span class="c1"&gt;; lib/dune&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;library&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="nv"&gt;math&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Libraries in OCaml are similar to index files in JavaScript; they expose modules.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Register a Library
&lt;/h2&gt;

&lt;p&gt;In a similar way, if you want to consume a library in another &lt;code&gt;.ml&lt;/code&gt; file you need to register it in its adjacent &lt;code&gt;dune&lt;/code&gt; file to make it accessible, let's make it accessible to the &lt;code&gt;bin/main.ml&lt;/code&gt; file: &lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;bin/&lt;/code&gt; folder open the &lt;code&gt;dune&lt;/code&gt; file and register the library by its name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scheme"&gt;&lt;code&gt;&lt;span class="c1"&gt;; bin/dune&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;executable&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;public_name&lt;/span&gt; &lt;span class="nv"&gt;ocaml_dune&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;libraries&lt;/span&gt; &lt;span class="nv"&gt;math&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;; Include your module here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use a Library
&lt;/h2&gt;

&lt;p&gt;Use the &lt;code&gt;open&lt;/code&gt; keyword to access the library in &lt;code&gt;main.ml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* bin/main.ml *)&lt;/span&gt;
&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c"&gt;(* in other programming languages this would be to your main function equivalent *)&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Calc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
  &lt;span class="n"&gt;print_endline&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;(* Output: 5 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that you also use the &lt;code&gt;Int&lt;/code&gt; module from the standard library to convert a number to a string.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the Project
&lt;/h3&gt;

&lt;p&gt;Compile and execute your project in watch mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dune &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🟣 Create an Interface File
&lt;/h1&gt;

&lt;p&gt;In Dune it's possible to separate your interfaces from your implementation through &lt;code&gt;.mli&lt;/code&gt; files. They serve as a way for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encapsulation: helps define the public interface of a module.&lt;/li&gt;
&lt;li&gt;Hide implementation details: makes possible to change module internals without affecting other dependent parts.&lt;/li&gt;
&lt;li&gt;Documentation: it's a good practice to include specifications for clarity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the &lt;code&gt;lib/&lt;/code&gt; folder create an &lt;code&gt;.mli&lt;/code&gt; file with the same name as its corresponding module, &lt;code&gt;calc.mli&lt;/code&gt; in this case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* lib/calc.mli *)&lt;/span&gt;
&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="c"&gt;(** [add x y] returns the sum of x and y. *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Run the Project
&lt;/h4&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dune &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Add the &lt;code&gt;sub&lt;/code&gt; function to the &lt;code&gt;main.ml&lt;/code&gt; file
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* bin/main.ml *)&lt;/span&gt;
&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c"&gt;(* in other programming languages this would be to your main function equivalent *)&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Calc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
  &lt;span class="n"&gt;print_endline&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;(* Output: 5 *)&lt;/span&gt;

  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Calc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
  &lt;span class="n"&gt;print_endline&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;(* Output: 2 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you see if you attempt to use &lt;code&gt;sub&lt;/code&gt; it will result in an error, it's because the &lt;code&gt;sub&lt;/code&gt; function has not been exposed yet, to solve it add the &lt;code&gt;sub&lt;/code&gt; interface in &lt;code&gt;calc.mli&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* lib/calc.mli *)&lt;/span&gt;
&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="c"&gt;(** [add x y] returns the sum of x and y. *)&lt;/span&gt;

&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="c"&gt;(** [sub x y] returns the difference of x and y. *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Congratulations! You have created your first code in OCaml!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy coding with OCaml! 🚀&lt;/p&gt;




&lt;h1&gt;
  
  
  Next Steps
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Did this help?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give it a ❤️&lt;/li&gt;
&lt;li&gt;Follow for &lt;strong&gt;Part 3: &lt;a href="https://dev.to/david2am/ocamldune-modules-libraries-like-js-but-better-4fn"&gt;OCaml Dependencies&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If you want to dig into OCaml I wrote &lt;a href="https://dev.to/david2am/basic-ocaml-2j0g"&gt;Basic OCaml&lt;/a&gt; and its second part &lt;a href="https://dev.to/david2am/practical-ocaml-1h71"&gt;Practical OCaml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Share with one friend learning systems programming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Have a question? Comment below — I reply to all!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ocamlverse.net/content/quickstart_ocaml_project_dune.html" rel="noopener noreferrer"&gt;OCamlVerse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dune.readthedocs.io/en/stable/tutorials/developing-with-dune" rel="noopener noreferrer"&gt;Dune Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>ocaml</category>
    </item>
    <item>
      <title>Why you should consider OCaml in your toolkit</title>
      <dc:creator>david2am</dc:creator>
      <pubDate>Fri, 13 Jun 2025 15:43:03 +0000</pubDate>
      <link>https://forem.com/david2am/why-you-should-consider-ocaml-in-your-toolkit-421o</link>
      <guid>https://forem.com/david2am/why-you-should-consider-ocaml-in-your-toolkit-421o</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/david2am/when-failure-is-not-an-option-a-practical-case-for-ocaml-fag" class="crayons-story__hidden-navigation-link"&gt;When Failure is Not an Option: A Practical Case for OCaml&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/david2am" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F544667%2Fff229d9f-1572-49ca-8f07-5af8d3c332bb.jpeg" alt="david2am profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/david2am" class="crayons-story__secondary fw-medium m:hidden"&gt;
              david2am
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                david2am
                
              
              &lt;div id="story-author-preview-content-2590143" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/david2am" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F544667%2Fff229d9f-1572-49ca-8f07-5af8d3c332bb.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;david2am&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/david2am/when-failure-is-not-an-option-a-practical-case-for-ocaml-fag" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 13 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/david2am/when-failure-is-not-an-option-a-practical-case-for-ocaml-fag" id="article-link-2590143"&gt;
          When Failure is Not an Option: A Practical Case for OCaml
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ocaml"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ocaml&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/functional"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;functional&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/david2am/when-failure-is-not-an-option-a-practical-case-for-ocaml-fag" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/david2am/when-failure-is-not-an-option-a-practical-case-for-ocaml-fag#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ocaml</category>
      <category>performance</category>
      <category>functional</category>
      <category>programming</category>
    </item>
    <item>
      <title>When Failure is Not an Option: A Practical Case for OCaml</title>
      <dc:creator>david2am</dc:creator>
      <pubDate>Fri, 13 Jun 2025 15:29:28 +0000</pubDate>
      <link>https://forem.com/david2am/when-failure-is-not-an-option-a-practical-case-for-ocaml-fag</link>
      <guid>https://forem.com/david2am/when-failure-is-not-an-option-a-practical-case-for-ocaml-fag</guid>
      <description>&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=kZ1P8cHN3pY" rel="noopener noreferrer"&gt;Why Functional Programming Doesn't Matters&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=v1CmGbOGb2I&amp;amp;t=2556s" rel="noopener noreferrer"&gt;Why OCaml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.realworldocaml.org" rel="noopener noreferrer"&gt;Real World OCaml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://patternmatched.substack.com/p/algebraic-data-types?r=327h32&amp;amp;triedRedirect=true" rel="noopener noreferrer"&gt;Algebraic Data Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=_yDo9Q9EOHY" rel="noopener noreferrer"&gt;Hindley-Milner Type Inference&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Index
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A New Perspective on Programming&lt;/li&gt;
&lt;li&gt;The "Aha!" Moment&lt;/li&gt;
&lt;li&gt;
The Five Pillars of OCaml

&lt;ul&gt;
&lt;li&gt;Performance Without Sacrifice&lt;/li&gt;
&lt;li&gt;Correctness with Safety Nets&lt;/li&gt;
&lt;li&gt;Power and Agility&lt;/li&gt;
&lt;li&gt;Functional&lt;/li&gt;
&lt;li&gt;But Practical&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;The Takeaway&lt;/li&gt;

&lt;li&gt;Explore Together&lt;/li&gt;

&lt;li&gt;Next Steps&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🟣 A New Perspective on Programming
&lt;/h2&gt;

&lt;p&gt;Don't take me wrong, we do great things on the Web, and there are a lot of smart people working on it but I started to feel that I needed more within programming from a year ago.&lt;/p&gt;

&lt;p&gt;Curiosity lead me to system's level programming languages, I learned some C and C++ in the university, but I wanted something less intimidating than C or Rust and more performant than JavaScript or Python, in other words, something in between.&lt;/p&gt;

&lt;p&gt;So I learn a bit of Zig (in my opinion a wonderful programming language), I enjoyed it but I felt the trade-off between fine-grained control and rapid productivity, so... I needed something else.&lt;/p&gt;




&lt;h2&gt;
  
  
  🟣 The Aha Moment
&lt;/h2&gt;

&lt;p&gt;I used to hear Developer Voices, a YouTube channel directed by Kris Jenkins, and one day I heard a conversation between Kris and a guy, Leandro Ostera, about this programming language called OCaml 🐪, to be honest I didn't get much, I just heard about functional programming here an there and this catchy phrase "OCaml my Caml!" that I didn't get 😆 but by listening Leandro I realized that he also experienced this "should be more out there" sensation, so I felt connected, and to my surprise the programming language he talked seems to be in the sweet spot I was looking for: something performant and expressive without much sacrifices. &lt;/p&gt;

&lt;p&gt;So I used my spare time to learn about OCaml, tried it a little bit and after some time I'm still in love and I want to share with you some of the reasons I think it's especial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's elegant and effective in the real world.&lt;/li&gt;
&lt;li&gt;It has a friendly community of very talented people.&lt;/li&gt;
&lt;li&gt;There are some companies that express such confidence in the language that built their entire organizations in OCaml's shoulders.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🟣 The Five Pillars of OCaml
&lt;/h2&gt;

&lt;p&gt;You might be thinking, "I can do all of this in my current language." And you're probably right. But let me ask you: how confident are you in the code you just wrote? Would you bet your company's critical system on it?&lt;/p&gt;

&lt;p&gt;At least in the TypeScript world, we often add state machine libraries to gain a high degree of confidence and predictability, but that means extra dependencies, complexity, and more things that could break.&lt;/p&gt;

&lt;p&gt;With OCaml, that confidence comes built-in, the language itself is your safety net:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; It offers native compilation and static typing without sacrificing expressiveness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctness:&lt;/strong&gt; It helps you deliver what you intended with safety and reliability baked in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dexterity:&lt;/strong&gt; It gives you the power and agility to get things done quickly, efficiently, and safely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Functional&lt;/strong&gt; It's easy to reason about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical&lt;/strong&gt; Where purity could introduce complexity OCaml introduce simplicity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's see how this works in practice.&lt;/p&gt;




&lt;h3&gt;
  
  
  🟣 Performance Without Sacrifice
&lt;/h3&gt;

&lt;p&gt;OCaml is a compiled, statically-typed language that offers a rare combination of high-level expressiveness and raw performance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its &lt;strong&gt;native code compiler&lt;/strong&gt; produces fast, optimized executables.&lt;/li&gt;
&lt;li&gt;It provides &lt;strong&gt;zero-cost abstractions&lt;/strong&gt;, so you can write elegant and declarative code without a performance penalty.&lt;/li&gt;
&lt;li&gt;Its &lt;strong&gt;predictable garbage collector&lt;/strong&gt; is ideal for low-latency systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In other words, OCaml let you focus on your business logic without a performance penalty.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🟣 Correctness with Safety Nets
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Thinking in Edge Cases
&lt;/h4&gt;

&lt;p&gt;I mentioned before that as web developers we gain confidence using state machine libraries, OCaml in another hand, give you the same with two built-in features: types and pattern-matching.&lt;/p&gt;

&lt;p&gt;For example: OCaml's compiler forces you to consider edge cases from the beginning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_favorite_language&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_favorite&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;the_rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_favorite&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(* Warning 8 [partial-match]: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
[] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're encouraged to handle all possibilities using &lt;strong&gt;pattern matching&lt;/strong&gt;, a powerful feature that's like a switch statement on steroids.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_favorite_language&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;the_rest&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"OCaml"&lt;/span&gt; &lt;span class="c"&gt;(* A sensible default! *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Making Illegal States Unrepresentable
&lt;/h4&gt;

&lt;p&gt;This is OCaml's superpower. Imagine you have a &lt;code&gt;shape&lt;/code&gt; type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When business requirements change and you need to add a &lt;code&gt;Triangle&lt;/code&gt;, you simply update the type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Triangle&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;  &lt;span class="c"&gt;(* base, height *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler then becomes your assistant, pointing out every function that doesn't yet handle &lt;code&gt;Triangle&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;*.&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*.&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;

&lt;span class="c"&gt;(*
  Error (warning 8): this pattern-matching is not exhaustive.
  Here is an example of a case that is not matched:
  Triangle (_, _)
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Now your business logic is encoded directly in the type system. Once you fix the compiler errors, you can be confident that the code is correct.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🟣 Power and Agility
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Type Inference That Helps, Not Hinders
&lt;/h4&gt;

&lt;p&gt;OCaml provides strong typing without the verbose annotations. Its powerful type inference system deduces types for you, letting you focus once again in your domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(* val sum : int -&amp;gt; int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you make a mistake, the error messages are your friend.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add_potato&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"potato"&lt;/span&gt;
&lt;span class="c"&gt;(* Error: This expression has type string but an expression was expected of type int *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You get the benefits of strong typing with the feel of a dynamic language, giving you the agility to refactor and build with confidence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🟣 Functional
&lt;/h3&gt;

&lt;p&gt;It's very easy to reason about an OCaml program:&lt;/p&gt;

&lt;h4&gt;
  
  
  Everything is an Expression
&lt;/h4&gt;

&lt;p&gt;In OCaml, almost everything is an expression that returns a value. This includes not just calculations but even conditionals.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Definitions are like permanent assignments *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="c"&gt;(* Even conditionals are expressions that return a value *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"this value"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;"that value"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Functional to the Core
&lt;/h4&gt;

&lt;p&gt;OCaml encourages a functional style, which leads to more predictable and maintainable code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Immutability by Default:&lt;/strong&gt; Once a value is defined, it can't be changed. This eliminates a whole class of bugs related to unexpected state changes.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;     &lt;span class="c"&gt;(* pi is now 3.1 *)&lt;/span&gt;
&lt;span class="c"&gt;(* pi = 3.1415  &amp;lt;- This would be an error *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1415&lt;/span&gt;  &lt;span class="c"&gt;(* This creates a *new* value for pi *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Higher-Order Functions:&lt;/strong&gt; Functions are treated like any other value. You can pass them as arguments, return them from other functions, and store them in data structures.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* 'List.fold_left' takes a function as its first argument *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fold_left&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Purity:&lt;/strong&gt; A pure function's behavior depends only on its inputs. This makes functions easier to reason about, compose, and test because there are no hidden side effects.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟣 But Practical
&lt;/h3&gt;

&lt;p&gt;While OCaml encourages purity, it's also pragmatic. In situations where controlled mutation can simplify code, OCaml provides a clear and expressive way to handle it, for example allowing to access a reference outside it's normal scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
  &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;incr&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🟣 The Takeaway
&lt;/h2&gt;

&lt;p&gt;OCaml is, in my opinion, the only language that strikes the right balance between performance, expressiveness, and practicality.&lt;/p&gt;

&lt;p&gt;OCaml's sweet spot is high-predictability, high-reliability, and high-performance systems. This is why it's trusted in production by companies in demanding fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Finance:&lt;/strong&gt; Jane Street&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Tools:&lt;/strong&gt; Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Services:&lt;/strong&gt; Ahrefs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blockchain:&lt;/strong&gt; Tezos&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The pattern is clear: &lt;strong&gt;when failure is not an option, OCaml becomes the option.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But here's the key insight: because OCaml doesn't force you to trade expressiveness for performance, its potential extends far beyond these critical systems. We could—and should—be building much more with it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🟣 Explore Together
&lt;/h2&gt;

&lt;p&gt;If any of this sparked your curiosity, I'd love to explore it with you. I'm building small things, writing about my journey, and learning in public.&lt;/p&gt;

&lt;p&gt;Let's stay in touch. Let's keep growing.&lt;/p&gt;

&lt;h2&gt;
  
  
  🟣 Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you want to explore and build your first OCaml project visit my tutorial &lt;a href="https://dev.to/david2am/ocamldune-tutorial-5688"&gt;OCaml/Dune&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;If you want to explore OCaml syntax visit my tutorial &lt;a href="https://dev.to/david2am/basic-ocaml-2j0g"&gt;Basic OCaml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ocaml</category>
      <category>performance</category>
      <category>functional</category>
      <category>programming</category>
    </item>
    <item>
      <title>Practical OCaml</title>
      <dc:creator>david2am</dc:creator>
      <pubDate>Fri, 25 Apr 2025 21:17:50 +0000</pubDate>
      <link>https://forem.com/david2am/practical-ocaml-1h71</link>
      <guid>https://forem.com/david2am/practical-ocaml-1h71</guid>
      <description>&lt;p&gt;Welcome to the second part of &lt;code&gt;Basic OCaml&lt;/code&gt;, where we dive into writing practical OCaml code! This tutorial builds upon the foundational concepts introduced earlier, ensuring a smooth and comprehensive learning experience. Each topic is presented in an easy-to-follow manner, with new concepts building upon previous ones.&lt;/p&gt;

&lt;p&gt;This tutorial is based on my notes from Professor Michael Ryan Clarkson’s excellent course, along with insights from OCaml’s official manual and documentation. A huge thank you to Professor Michael for his incredible teaching and to Sabine for creating such clear and comprehensive documentation! 🫰&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MUcka_SvhLw&amp;amp;list=PLre5AT9JnKShBOPeuiD9b-I4XROIJhkIU" rel="noopener noreferrer"&gt;OCaml Programming: Correct + Efficient + Beautiful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/manual/5.3/index.html" rel="noopener noreferrer"&gt;OCaml Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/docs/values-and-functions" rel="noopener noreferrer"&gt;OCaml Docs/Values and Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/docs/basic-data-types" rel="noopener noreferrer"&gt;OCaml Docs/Basic Data Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/manual/5.3/api" rel="noopener noreferrer"&gt;The OCaml API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy reading! 🚀&lt;/p&gt;




&lt;h1&gt;
  
  
  Index
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Tail Recursion Optimization&lt;/li&gt;
&lt;li&gt;Recursive and Parameterized Variants&lt;/li&gt;
&lt;li&gt;
Handling Errors

&lt;ul&gt;
&lt;li&gt;Option Type&lt;/li&gt;
&lt;li&gt;Result Type&lt;/li&gt;
&lt;li&gt;Exceptions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Mutations in OCaml

&lt;ul&gt;
&lt;li&gt;References (Refs)&lt;/li&gt;
&lt;li&gt;Aliasing&lt;/li&gt;
&lt;li&gt;Equality&lt;/li&gt;
&lt;li&gt;Sequence Operator (&lt;code&gt;;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Mutable Record Fields&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Arrays&lt;/li&gt;

&lt;/ul&gt;




&lt;h1&gt;
  
  
  Tail Recursion Optimization
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Tail Recursion&lt;/strong&gt; is an optimization technique where a function call is the last action in a function. This allows the compiler to reuse the current function's stack frame for the next function call, preventing stack overflow and improving performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to Apply Tail Recursion:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify the Base Case and Recursive Case&lt;/strong&gt;: Determine the condition under which the recursion should stop (base case) and the part of the function that makes the recursive call (recursive case).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introduce an Accumulator&lt;/strong&gt;: Add an additional parameter to the function, known as an accumulator, which will store the intermediate results of the computation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modify the Recursive Call&lt;/strong&gt;: Change the recursive call so that it passes the accumulator as an argument, and ensure that the recursive call is the last operation in the function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update the Base Case&lt;/strong&gt;: Modify the base case to return the accumulator instead of performing additional computation.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example: Factorial Function
&lt;/h3&gt;

&lt;p&gt;Let's convert a non-tail-recursive factorial function into a tail-recursive one.&lt;/p&gt;

&lt;h4&gt;
  
  
  Non-Tail-Recursive Version:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Multiplication is the last operation, so it's not tail recursive *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Tail-Recursive Version:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="n"&gt;factorial_tail&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;
  &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="n"&gt;factorial_tail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; The factorial_tail call is the last operation, so it's tail recursive *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factorial_tail&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explanation:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accumulator&lt;/strong&gt;: &lt;code&gt;acc&lt;/code&gt; is introduced to store the intermediate result of the &lt;code&gt;factorial&lt;/code&gt; computation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursive Call&lt;/strong&gt;: The recursive call &lt;code&gt;factorial_tail (n - 1) (acc * n)&lt;/code&gt; is the last operation in the function, making it tail-recursive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base Case&lt;/strong&gt;: When &lt;code&gt;n = 0&lt;/code&gt;, the function returns the accumulator &lt;code&gt;acc&lt;/code&gt;, which contains the final result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Alternative Syntax:
&lt;/h4&gt;

&lt;p&gt;A common way to write this in OCaml is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="n"&gt;factorial_tail&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;
    &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="n"&gt;factorial_tail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;in&lt;/span&gt;
  &lt;span class="n"&gt;factorial_tail&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Recursive and Parameterized Variants
&lt;/h1&gt;

&lt;p&gt;In OCaml, you can create recursive variants to build more complex data structures. Let's create our own version of lists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;intList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;intList&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; type intList = Nil | Cons of int * intList *)&lt;/span&gt;

&lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt;&lt;span class="p"&gt;)));;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : intList = Cons (1, Cons (2, Cons (3, Nil))) *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, &lt;code&gt;intList&lt;/code&gt; is recursive, allowing the creation of recursive data structures, such as a list of integers. Let's see another example, this time creating a list of strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;stringList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;stringList&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; type stringList = Nil | Cons of string * stringList *)&lt;/span&gt;

&lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"hola"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mundo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt;&lt;span class="p"&gt;));;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : stringList = ("hola", Cons ("mundo", Nil)) *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To avoid creating a new variant for each type of list, we can use polymorphism to parameterize any kind of list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="kt"&gt;customList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="n"&gt;customList&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; type 'a customList = Nil | Cons of 'a * 'a customList *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;int_list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt;&lt;span class="p"&gt;)));;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val int_list : int customList = Cons (1, Cons (2, Cons (3, Nil))) *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;string_list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"hola"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mundo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt;&lt;span class="p"&gt;));;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val string_list : string customList = Cons ("hola", Cons ("mundo", Nil)) *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To achieve this, we add the &lt;code&gt;'a&lt;/code&gt; &lt;strong&gt;type variable&lt;/strong&gt; in front of the type name as &lt;code&gt;'a customList&lt;/code&gt; and use it wherever needed: &lt;code&gt;'a * 'a customList&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We can also generalize subsequent operations for any type of list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="n"&gt;length_tail&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Nil&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Cons&lt;/span&gt; &lt;span class="p"&gt;(_,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;length_tail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
  &lt;span class="kr"&gt;in&lt;/span&gt;
  &lt;span class="n"&gt;length_tail&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val length : 'a customList -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="n"&gt;int_list&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 3 *)&lt;/span&gt;

&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="n"&gt;string_list&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 2 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This type of variant is called parametric because it adapts to its changeable parts. The &lt;code&gt;length&lt;/code&gt; function is parametric with respect to the type of the list.&lt;/p&gt;

&lt;p&gt;In fact, this is how lists are defined in OCaml's standard library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="kt"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;::&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists in OCaml are recursive parameterized variants.&lt;/p&gt;




&lt;h1&gt;
  
  
  Error Handling
&lt;/h1&gt;

&lt;p&gt;Errors are better handled as values instead of treating certain values as errors. This approach offers several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The program flow is not interrupted; it's redirected.&lt;/li&gt;
&lt;li&gt;Functions remain pure, avoiding side effects.&lt;/li&gt;
&lt;li&gt;You can handle values, not errors, making solutions more robust.&lt;/li&gt;
&lt;li&gt;Null pointer exceptions are avoided.&lt;/li&gt;
&lt;li&gt;Business logic is separated from error handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are three ways to handle errors in OCaml:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Option values&lt;/li&gt;
&lt;li&gt;Result values&lt;/li&gt;
&lt;li&gt;Exceptions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Option Type
&lt;/h2&gt;

&lt;p&gt;The option type represents a value that may or may not be present. It handles the absence of a value in a type-safe manner, avoiding the need for special sentinel values or null pointers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;The option type is a parametric variant that can have one of two forms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="kt"&gt;option&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Some&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;'a&lt;/code&gt;: This is a type variable, meaning option can be used with any type.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Some&lt;/code&gt;: Indicates that a value is present.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;None&lt;/code&gt;: Indicates that no value is present.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;option type&lt;/strong&gt; is useful when a function might not return a valid result.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: Prevent Finding an Element in an Empty List
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="n"&gt;find_element&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;None&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;::&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="n"&gt;Some&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="n"&gt;find_element&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val find_element : 'a -&amp;gt; 'a list -&amp;gt; 'a option = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;find_element&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int option = None *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Summary:
&lt;/h4&gt;

&lt;p&gt;You are explicitly telling your functions what to do in case of an undesirable input without crashing the program.&lt;/p&gt;




&lt;h2&gt;
  
  
  Result Type
&lt;/h2&gt;

&lt;p&gt;The result type represents a computation that can succeed with a value or fail with an error. It is similar to the option type but provides more information in case of an error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;The result type is also a &lt;strong&gt;parametric variant&lt;/strong&gt; that can have one of two forms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;'a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;'b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Ok&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="nd"&gt;'b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ok&lt;/code&gt; value: Represents a successful computation with a value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Error&lt;/code&gt; value: Represents a failed computation with an &lt;strong&gt;error value&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;The result type is useful when you need to produce specific kinds of errors, making error handling more robust.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: Throwing an Error Value When Trying to Get the First Element in an Empty List
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="s2"&gt;"Empty list"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;::&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ok&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val first_element : 'a list -&amp;gt; ('a, string) result = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="p"&gt;[];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : ('a, string) result = Error "Empty list" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example: Throwing an Error Value for Division by Zero
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;safe_divide&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="s2"&gt;"division by 0"&lt;/span&gt;
  &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="n"&gt;Ok&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val safe_divide : int -&amp;gt; int -&amp;gt; (int, string) result = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;safe_divide&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : (int, string) result = Error "division by 0" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Summary:
&lt;/h4&gt;

&lt;p&gt;You are explicitly telling your functions what to do in case of an error without crashing the program.&lt;/p&gt;




&lt;h2&gt;
  
  
  Exceptions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;Exceptions (&lt;code&gt;exn&lt;/code&gt;) are a special type of variants called &lt;strong&gt;extensible variants&lt;/strong&gt;. You can add constructors later on with the &lt;code&gt;exception&lt;/code&gt; keyword:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;exception&lt;/span&gt; &lt;span class="nc"&gt;SomethingHappened&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SomethingHappened&lt;/code&gt; is a new constructor added to the type &lt;code&gt;exn&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Raising an Exception
&lt;/h3&gt;

&lt;p&gt;To raise an exception, call the &lt;code&gt;raise&lt;/code&gt; function with a value from the constructor as an argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="nc"&gt;SomethingHappened&lt;/span&gt; &lt;span class="s2"&gt;"Something went wrong"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that &lt;code&gt;raise&lt;/code&gt; never returns a value; it interrupts the normal flow of the program and must be caught.&lt;/p&gt;

&lt;h3&gt;
  
  
  Catching Exceptions
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;try ... with&lt;/code&gt; construct provides a clean separation for handling exceptions, allowing you to separate the "happy path" code from error-handling logic. Here's a general structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;safe_operation&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt;
    &lt;span class="nc"&gt;Ok&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;some_risky_function&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;with&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;EmptyList&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="s2"&gt;"Got an empty list"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Invalid_argument&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Invalid argument: "&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="s2"&gt;"Unknown error occurred"&lt;/span&gt;  &lt;span class="c"&gt;(** Catch-all pattern **)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can match specific exceptions and respond accordingly, or use &lt;code&gt;_&lt;/code&gt; to catch any unhandled exceptions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Concrete Example: Safe Division
&lt;/h4&gt;

&lt;p&gt;Let's say we want to divide two floats but avoid division by zero:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Invalid_argument&lt;/span&gt; &lt;span class="s2"&gt;"Division by 0"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/.&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(* val div : float -&amp;gt; float -&amp;gt; float = &amp;lt;fun&amp;gt; *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can wrap it safely like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;safe_div&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt;
    &lt;span class="nc"&gt;Ok&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;with&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;Invalid_argument&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Invalid argument: "&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="s2"&gt;"Unknown error occurred"&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(* val safe_div : float -&amp;gt; float -&amp;gt; (float, string) result = &amp;lt;fun&amp;gt; *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So anytime &lt;code&gt;y&lt;/code&gt; takes a value of &lt;code&gt;0&lt;/code&gt;, an &lt;code&gt;Invalid_argument&lt;/code&gt; error is raised:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="n"&gt;safe_div&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.;;&lt;/span&gt;
&lt;span class="c"&gt;(* : (float, string) result = Ok 3. *)&lt;/span&gt;

&lt;span class="n"&gt;safe_div&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.;;&lt;/span&gt;
&lt;span class="c"&gt;(* : (float, string) result = Error "Invalid argument: Division by 0" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Extracting the Value:
&lt;/h4&gt;

&lt;p&gt;If you need the value, you can use the built-in &lt;code&gt;Result&lt;/code&gt; module to help you and pass a default value in case an error occurs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;safe_div&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;~default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: By building programs with errors in mind, we naturally create more robust software. It’s a form of testing as we code—we anticipate possible failures and plan how to handle them gracefully.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Mutations in OCaml
&lt;/h1&gt;

&lt;p&gt;Sometimes side effects are necessary. Let's see how OCaml handles them:&lt;/p&gt;

&lt;h2&gt;
  
  
  References (Refs)
&lt;/h2&gt;

&lt;p&gt;A reference is a pointer to a typed location in memory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The binding to a pointer is: &lt;strong&gt;immutable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The content of the memory location is: &lt;strong&gt;mutable&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;Let's see the most basic operations you can do with references:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;* Create a new ref **)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val value : int ref = {contents = 123} *)&lt;/span&gt;

&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;:=&lt;/span&gt; &lt;span class="mi"&gt;321&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;* Change the content **)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : unit = () *)&lt;/span&gt;

&lt;span class="n"&gt;!value&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;* Extract the content **)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 321 *)&lt;/span&gt;

&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;:=&lt;/span&gt; &lt;span class="s2"&gt;"mi piace la pizza!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;* Trying to change the content's type **)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Error: This constant has type string but an expression was expected of type int *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;ref&lt;/code&gt; keyword creates a new reference.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;:=&lt;/code&gt; operator assigns a new content to the reference.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;!&lt;/code&gt; (bang) operator extracts the content of the reference.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Notice&lt;/strong&gt;: Once defined, you can't change the type of a reference, so the last operation throws an error.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Aliasing
&lt;/h2&gt;

&lt;p&gt;Aliasing occurs when two or more references point to the same location in memory.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;* aliases **)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both &lt;code&gt;age&lt;/code&gt; and &lt;code&gt;my_age&lt;/code&gt; point to the same location in memory. As a result, changing the content of &lt;code&gt;age&lt;/code&gt; also changes &lt;code&gt;my_age&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="n"&gt;:=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="n"&gt;!my_age&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 34 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Equality
&lt;/h2&gt;

&lt;p&gt;Now you are prepared to understand the distinction between physical and structural equality:&lt;/p&gt;

&lt;h3&gt;
  
  
  Physical Equality
&lt;/h3&gt;

&lt;p&gt;Evaluates the same location in memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;* Evaluates the same location in memory **)&lt;/span&gt;
&lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="n"&gt;==&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = true *)&lt;/span&gt;

&lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="n"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = true *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It uses the &lt;code&gt;==&lt;/code&gt; and &lt;code&gt;!=&lt;/code&gt; operators.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structural Equality
&lt;/h3&gt;

&lt;p&gt;Evaluates the same content in memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;* Evaluates the same content in memory **)&lt;/span&gt;
&lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = true *)&lt;/span&gt;

&lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = true *)&lt;/span&gt;

&lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt; &lt;span class="n"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;321&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = true *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It uses the &lt;code&gt;=&lt;/code&gt; and &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; operators.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sequence Operator (&lt;code&gt;;&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;The sequence operator allows you to execute multiple expressions in sequence, returning the value of the last expression.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;expression1&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;expression2&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;expression3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this sequence, all expressions are evaluated in order, but only the value of the last expression (&lt;code&gt;expression3&lt;/code&gt;) is returned as the result of the entire sequence.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;print_string&lt;/span&gt; &lt;span class="s2"&gt;"Hello, "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;print_string&lt;/span&gt; &lt;span class="s2"&gt;"OCaml!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This evaluates to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prints "Hello, OCaml!" to the console.&lt;/li&gt;
&lt;li&gt;Returns the integer value &lt;code&gt;42&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Side Effects&lt;/strong&gt;: Since only the last value is returned and the previous values are discarded, their sole purpose is to produce side effects.&lt;/p&gt;

&lt;h4&gt;
  
  
  Counter Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nf"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="n"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;!counter&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;!counter&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or its syntactic sugar version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;incr&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;!counter&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 1 *)&lt;/span&gt;

&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 2 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Writing side effects in OCaml is beautiful. It uses special syntax that makes it expressive, helping you be conscious of possible side effects whenever you see them.&lt;/p&gt;

&lt;p&gt;Bear in mind that this is not the only way to build a counter in OCaml. It can also be created through a closure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt;
  &lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nf"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;incr&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;!counter&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Mutable Record Fields
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;point&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;mutable&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"blue"&lt;/span&gt; &lt;span class="p"&gt;};;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val p1 : point = { x = 1.; y = 2.; color = "blue" } *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="n"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="s2"&gt;"red"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : unit = () *)&lt;/span&gt;

&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : point = {x = 1.; y = 2.; color = "red"} *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is possible because we declared &lt;code&gt;color&lt;/code&gt; as a &lt;strong&gt;mutable&lt;/strong&gt; field.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Error: The record field x is not mutable *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;&amp;lt;-&lt;/code&gt; operator is used to mutate fields.&lt;/p&gt;

&lt;p&gt;References in OCaml are essentially implemented as records with mutable fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="kt"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;mutable&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nd"&gt;'a&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Returns a record with a mutable value *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Receives a record and returns its 'contents' field *)&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;:=&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;newval&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="n"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;newval&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Updates the mutable field 'contents' *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Arrays
&lt;/h1&gt;

&lt;p&gt;Arrays provide a way to store a fixed-size collection of elements of the same type, allowing for efficient random access and updates. Unlike lists, arrays are mutable, meaning you can change the value of an element after the array has been created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[|&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;|];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val numbers : int array = [|1; 2; 3; 4; 5|] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating Arrays
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;zeros&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; zeros is [|0; 0; 0; 0; 0|] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;i&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; squares is [|0; 1; 4; 9; 16|] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Accessing Array Elements
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; first_element is 1 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Modifying Array Elements
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; numbers is now [|10; 2; 3; 4; 5|] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Array Functions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Array.length&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Returns the length of a given array.&lt;br&gt;
Usage: &lt;code&gt;Array.length array&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="p"&gt;[|&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;|];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 3 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Array.map&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Applies a function to each element of an array and returns a new array with the results.&lt;br&gt;
Usage: &lt;code&gt;Array.map function array&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[|&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;|];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int array = [|2; 4; 6|] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Array.iter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Applies a given function to each element of an array for side effects, such as printing.&lt;br&gt;
Usage: &lt;code&gt;Array.iter func array&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%d "&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[|&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;|];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;  1 2 3 4 : unit = () *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Array.fold_left&lt;/strong&gt; and &lt;strong&gt;Array.fold_right&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fold functions that reduce an array to a single value using a binary function.&lt;br&gt;
Usage: &lt;code&gt;Array.fold_left func acc array&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fold_left&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;[|&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;|];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 10 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ocaml</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>Basic OCaml</title>
      <dc:creator>david2am</dc:creator>
      <pubDate>Wed, 02 Apr 2025 22:23:08 +0000</pubDate>
      <link>https://forem.com/david2am/basic-ocaml-2j0g</link>
      <guid>https://forem.com/david2am/basic-ocaml-2j0g</guid>
      <description>&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tx64r92ywj5o1mwg9k39.png" rel="noopener noreferrer"&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tx64r92ywj5o1mwg9k39.png&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Welcome to this beginner-friendly OCaml tutorial! My goal is to make this your ultimate introduction to the language, covering all the fundamental concepts in a structured, easy-to-follow way. Each new topic builds upon the previous ones, ensuring a smooth learning experience.&lt;/p&gt;

&lt;p&gt;This tutorial is based on my notes from Professor Michael Ryan Clarkson’s excellent course, along with insights from OCaml’s official manual and documentation. A huge thank you to Professor Michael for his incredible teaching and to Sabine for creating such clear and comprehensive documentation! 🫰&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MUcka_SvhLw&amp;amp;list=PLre5AT9JnKShBOPeuiD9b-I4XROIJhkIU" rel="noopener noreferrer"&gt;OCaml Programming: Correct + Efficient + Beautiful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://byjus.com/maths/recursive-function" rel="noopener noreferrer"&gt;Byjus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/manual/5.3/index.html" rel="noopener noreferrer"&gt;OCaml Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/docs/values-and-functions" rel="noopener noreferrer"&gt;OCaml Docs/Values and Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/docs/basic-data-types" rel="noopener noreferrer"&gt;OCaml Docs/Basic Data Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocaml.org/manual/5.3/api" rel="noopener noreferrer"&gt;The OCaml API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy reading! 🚀&lt;/p&gt;




&lt;h1&gt;
  
  
  Index
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Utop&lt;/li&gt;
&lt;li&gt;SECTION 1: EXPRESSIONS AND DEFINITIONS

&lt;ul&gt;
&lt;li&gt;Values&lt;/li&gt;
&lt;li&gt;If Expressions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unit&lt;/code&gt; Type&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;let&lt;/code&gt; Definitions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;let&lt;/code&gt; Expressions&lt;/li&gt;
&lt;li&gt;Anonymous Functions&lt;/li&gt;
&lt;li&gt;Named Functions&lt;/li&gt;
&lt;li&gt;High-Order Functions&lt;/li&gt;
&lt;li&gt;Recursive Functions&lt;/li&gt;
&lt;li&gt;Operators As Functions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;SECTION 2: COMMON DATA STRUCTURES AND OPERATIONS

&lt;ul&gt;
&lt;li&gt;Lists&lt;/li&gt;
&lt;li&gt;Tuples&lt;/li&gt;
&lt;li&gt;Records&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;SECTION 3: DIGGING IN OCAML

&lt;ul&gt;
&lt;li&gt;Lexical Scope&lt;/li&gt;
&lt;li&gt;Parametric Polymorphism&lt;/li&gt;
&lt;li&gt;Variants&lt;/li&gt;
&lt;li&gt;Pattern Matching&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Next Steps&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Utop
&lt;/h1&gt;

&lt;p&gt;To follow this tutorial, you can use &lt;strong&gt;Utop&lt;/strong&gt;, OCaml's REPL (recommended), or &lt;strong&gt;Dune&lt;/strong&gt;. Here, I'll explain how to configure Utop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ensure you have OCaml and its associated tools installed (refer to the guide &lt;code&gt;/2. Ocaml in Dune.md&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Open a new terminal.&lt;/li&gt;
&lt;li&gt;Run the command &lt;code&gt;utop&lt;/code&gt; to start the interactive OCaml toplevel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Additionally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To evaluate an expression in &lt;strong&gt;Utop&lt;/strong&gt;, end each expression with &lt;code&gt;;;&lt;/code&gt; and then press &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To exit, execute the command &lt;code&gt;#quit;;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  SECTION 1: EXPRESSIONS AND DEFINITIONS
&lt;/h1&gt;

&lt;p&gt;In OCaml, expressions are code constructs that evaluate to a value without altering the program's state. Definitions introduce names and associate them with values, behaviors, types, or modules, known as &lt;strong&gt;bindings&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Values
&lt;/h2&gt;

&lt;p&gt;A value is an expression that doesn't need further evaluation. Let's explore some examples in OCaml:&lt;/p&gt;

&lt;h3&gt;
  
  
  Integers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 1 *)&lt;/span&gt;

&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 5 *)&lt;/span&gt;

&lt;span class="nn"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "14" *)&lt;/span&gt;

&lt;span class="nn"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 7 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Booleans
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = false *)&lt;/span&gt;

&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = true *)&lt;/span&gt;

&lt;span class="nn"&gt;Bool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "true" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Chars
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nd"&gt;'d'&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : char = 'd' *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Strings
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="s2"&gt;"hola!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "hola" *)&lt;/span&gt;

&lt;span class="s2"&gt;"hola"&lt;/span&gt; &lt;span class="n"&gt;^&lt;/span&gt; &lt;span class="s2"&gt;" mundo!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "hola mundo!" *)&lt;/span&gt;

&lt;span class="s2"&gt;"hola"&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : char = 'l' *)&lt;/span&gt;

&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="s2"&gt;"hola mundo!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 11 *)&lt;/span&gt;

&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uppercase_ascii&lt;/span&gt; &lt;span class="s2"&gt;"hola mundo!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "HOLA MUNDO!" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Floats
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 1.0 *)&lt;/span&gt;

&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 5.0 *)&lt;/span&gt;

&lt;span class="nn"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;of_string&lt;/span&gt; &lt;span class="s2"&gt;"14"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 14. *)&lt;/span&gt;

&lt;span class="nn"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt; &lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 6. *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OCaml distinguishes between integer and float operators, which helps the language infer type definitions directly from used operators. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;2.5 *. 5.&lt;/code&gt; is valid.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;7.5 +. 3&lt;/code&gt; is invalid because the operator &lt;code&gt;+.&lt;/code&gt; requires both numbers to be of type float.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OCaml includes built-in modules for common operations, such as &lt;code&gt;Float.round&lt;/code&gt; and &lt;code&gt;String.length&lt;/code&gt;. For more information, visit &lt;a href="https://ocaml.org/manual/5.3/api/index.html" rel="noopener noreferrer"&gt;The OCaml API&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  If Expressions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If expressions&lt;/strong&gt; conditionally evaluate one branch over another. In OCaml, &lt;strong&gt;if expressions&lt;/strong&gt; always return a value because their branches are expressions, and the &lt;strong&gt;else clause&lt;/strong&gt; is mandatory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="n"&gt;ifBranch&lt;/span&gt; &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="n"&gt;elseBranch&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; if condition is true then returns ifBranch *)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; if condition is false then returns elseBranch *)&lt;/span&gt;

&lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"pineapple pizza"&lt;/span&gt; &lt;span class="n"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"pizza margherita"&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"Non sei italiano"&lt;/span&gt; &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;"Tu sei un vero italiano"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "Tu sei un vero italiano" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Particularities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;condition expression&lt;/strong&gt; should evaluate to boolean.&lt;/li&gt;
&lt;li&gt;Both branch expressions should have the same type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;else branch&lt;/strong&gt; is required.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"Non sei italiano"&lt;/span&gt; &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;"Tu sei un vero italiano"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Error: value 0 is not a boolean expression *)&lt;/span&gt;

&lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"Non sei italiano"&lt;/span&gt; &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Error: "Non sei italiano" and 1 have different types *)&lt;/span&gt;

&lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"Non sei italiano"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Error: else branch is not provided *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;code&gt;unit&lt;/code&gt; Type
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;unit&lt;/code&gt; type is equivalent to &lt;code&gt;void&lt;/code&gt; in other programming languages but is a valid type in OCaml. It has only one possible value, denoted by &lt;code&gt;()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;print_endline&lt;/span&gt; &lt;span class="s2"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Hello, world! *)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : unit = () *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;code&gt;let&lt;/code&gt; Definitions
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;let&lt;/code&gt; definitions are bindings that are always immutable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Ciao!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val greet : string = "Ciao!" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The &lt;code&gt;utop&lt;/code&gt; response indicates that &lt;code&gt;"Ciao!"&lt;/code&gt; is a &lt;code&gt;string&lt;/code&gt; bound to a &lt;strong&gt;value definition&lt;/strong&gt; called &lt;code&gt;greet&lt;/code&gt; (it's readed from right to left).&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;let&lt;/code&gt; Definitions Are Immutable
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val pi : float = 3.1 *)&lt;/span&gt;

&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.1415&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = false *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.1415&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val pi : float = 3.1415 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;The result of &lt;code&gt;pi = 3.1&lt;/code&gt; may seem strange but satisfies immutability:

&lt;ul&gt;
&lt;li&gt;you can't mutate a &lt;code&gt;let&lt;/code&gt; definition&lt;/li&gt;
&lt;li&gt;In OCaml, &lt;code&gt;=&lt;/code&gt; is the boolean comparison operator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;let pi = 3.1415&lt;/code&gt; creates a new memory allocation with the same name &lt;code&gt;pi&lt;/code&gt;, so it's not a mutation but a re-definition.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;code&gt;let&lt;/code&gt; Expressions
&lt;/h2&gt;

&lt;p&gt;Let expressions allow you to bind subexpressions within a larger expression using a name. In OCaml, the &lt;code&gt;in&lt;/code&gt; keyword indicates that the preceding is a subexpression that can be used in subsequent expressions.&lt;/p&gt;

&lt;p&gt;This concept is similar to mathematical substitution, where you replace variables with their values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 10 *)&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   You can think of this as a kind of mathematical substitution:

   let x = 7

   in: 3 + x
   is: 3 + 7
   resolves to: 10
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let expressions can be used with any type of value, not just integers. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"salve"&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt; &lt;span class="n"&gt;^&lt;/span&gt; &lt;span class="s2"&gt;" mondo!"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val greet : string = "salve mondo!" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;let&lt;/code&gt; Expression Scope
&lt;/h3&gt;

&lt;p&gt;Scope refers to the region of a program where a binding is meaningful and can be accessed. In other words, it's where you can substitute a binding with its value.&lt;/p&gt;

&lt;p&gt;Let's revisit an example with a fresh perspective:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
                         &lt;span class="n"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
             &lt;span class="n"&gt;&amp;lt;-------&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="n"&gt;-------&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;&amp;lt;--------------&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="n"&gt;-------------&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Where A is a subexpression of B, and B a subexpression of a bigger expression C *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;x&lt;/code&gt; is meaningful within subexpression B, but not before.&lt;/li&gt;
&lt;li&gt;Similarly, &lt;code&gt;y&lt;/code&gt; is meaningful within subexpression A, but not before.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As OCaml follows &lt;strong&gt;lexical scoping&lt;/strong&gt; rules, the most recent definition of a binding takes precedence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 5 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
More into scoping is the &lt;code&gt;Lexical Scope&lt;/code&gt; section of this article.&lt;/p&gt;


&lt;h2&gt;
  
  
  Anonymous Functions
&lt;/h2&gt;

&lt;p&gt;Anonymous functions, also known as &lt;strong&gt;lambda functions&lt;/strong&gt;, are expressions that contain behavior. They are particularly useful for creating short, one-off functions that are often passed as arguments to higher-order functions. In OCaml, anonymous functions are defined using the &lt;code&gt;fun&lt;/code&gt; keyword:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This anonymous function takes an integer &lt;code&gt;x&lt;/code&gt; and returns &lt;code&gt;x + 10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The type signature &lt;code&gt;int -&amp;gt; int&lt;/code&gt; indicates that the function takes an integer as input and returns an integer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now let's pass an argument to the function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 45 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;In OCaml, you do not need to use parentheses to invoke a function.&lt;/li&gt;
&lt;li&gt;Here, &lt;code&gt;35&lt;/code&gt; is passed to the anonymous function, resulting in &lt;code&gt;45&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, &lt;code&gt;let&lt;/code&gt; expressions can be seen as syntactic sugar for function applications:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Both expressions are equivalent: *)&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;let&lt;/code&gt; expression binds &lt;code&gt;x&lt;/code&gt; to &lt;code&gt;35&lt;/code&gt; and then evaluates &lt;code&gt;x + 10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The anonymous function does the same by directly applying &lt;code&gt;35&lt;/code&gt; to the function body.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Named Functions
&lt;/h2&gt;

&lt;p&gt;In OCaml, anonymous functions are values, and using the &lt;code&gt;let&lt;/code&gt; keyword, you can create a binding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sum_10&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val sum_10 : int -&amp;gt; int = &amp;lt;fun&amp;gt;  *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can use a more concise syntax by placing the arguments on the left side of the equal sign and omitting the &lt;code&gt;fun&lt;/code&gt; and &lt;code&gt;-&amp;gt;&lt;/code&gt; keywords:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sum_10&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val sum_10 : int -&amp;gt; int = &amp;lt;fun&amp;gt;  *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This syntax achieves the same result but is more concise and readable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  High-Order Functions
&lt;/h2&gt;

&lt;p&gt;High-order functions are functions that take other functions as arguments or return them as results. They are a fundamental concept in functional programming and allow for greater abstraction and code reuse.&lt;/p&gt;

&lt;p&gt;The List.map function is a classic example of a high-order function. It applies a given function to each element of a list and returns a new list with the results.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int list = [2; 3; 4; 5] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List.map takes two arguments: a function (increment) and a list ([1; 2; 3; 4]).&lt;/li&gt;
&lt;li&gt;It applies the increment function to each element of the list, returning a new list with the incremented values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;High-order functions enable you to write more modular and reusable code by abstracting common patterns of computation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closures
&lt;/h3&gt;

&lt;p&gt;Closures refer to the ability of a function to capture and "remember" the environment in which it was created. This means that a function can access variables from its surrounding scope, even after that scope has finished executing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Multiplier Function&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;make_multiplier&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_multiplier&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;triple&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_multiplier&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 10 *)&lt;/span&gt;

&lt;span class="n"&gt;triple&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 15 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;make_multiplier&lt;/code&gt; is a function that takes a factor and returns another function.&lt;/li&gt;
&lt;li&gt;The returned function is a closure that captures the factor from its surrounding scope.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;double&lt;/code&gt; and &lt;code&gt;triple&lt;/code&gt; are instances of this closure, each capturing a different value for factor.&lt;/li&gt;
&lt;li&gt;When you call &lt;code&gt;double 5&lt;/code&gt;, it multiplies 5 by 2 (the captured factor), resulting in 10.&lt;/li&gt;
&lt;li&gt;Similarly, &lt;code&gt;triple 5&lt;/code&gt; multiplies 5 by 3, resulting in 15.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Partial Applications
&lt;/h3&gt;

&lt;p&gt;In OCaml, functions that take multiple arguments do not use commas to separate the arguments. Instead, arguments are separated by spaces, and functions that seem to take multiple arguments are actually several nested functions that take one argument at a time. This is called "currying."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int -&amp;gt; int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; is syntactic sugar of: *)&lt;/span&gt;
&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;y&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int -&amp;gt; int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is evident in their type definition: &lt;code&gt;: int -&amp;gt; int -&amp;gt; int&lt;/code&gt;, which is essentially a function that returns another function &lt;code&gt;: int -&amp;gt; (int -&amp;gt; int)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating Specialized Functions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You can use partial application to create specialized functions. For example, you can create a function &lt;code&gt;add_4&lt;/code&gt; that always adds 4 to any number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val add : int -&amp;gt; int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add_4&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val add_4 : int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;add_4&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 12 *)&lt;/span&gt;

&lt;span class="n"&gt;add_4&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 14 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The function &lt;code&gt;add&lt;/code&gt; takes two integers, &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;, and returns their sum.&lt;/li&gt;
&lt;li&gt;The type signature &lt;code&gt;int -&amp;gt; int -&amp;gt; int&lt;/code&gt; indicates that &lt;code&gt;add&lt;/code&gt; is a function that takes an integer and returns another function that takes an integer and returns an integer.&lt;/li&gt;
&lt;li&gt;By partially applying the &lt;code&gt;add&lt;/code&gt; function with the argument &lt;code&gt;4&lt;/code&gt;, you create a new function &lt;code&gt;add_4&lt;/code&gt; that only requires one argument, simplifying its usage.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Recursive Functions
&lt;/h2&gt;

&lt;p&gt;Imagine climbing a staircase from the ground floor to the first floor. You take each step one at a time. To reach the second step, you must first step onto the first. Similarly, to reach the third step, you must first be on the second step. Each step forward builds on the previous steps, creating a repeated sequence with a consistent pattern between each step. This concept illustrates recursion, where a problem is solved by breaking it down into smaller, similar sub-problems.&lt;/p&gt;

&lt;p&gt;(Example inspired by &lt;a href="https://byjus.com/maths/recursive-function" rel="noopener noreferrer"&gt;Byjus&lt;/a&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;                       &lt;span class="n"&gt;o&lt;/span&gt;
                      &lt;span class="n"&gt;/|\&lt;/span&gt;
                &lt;span class="p"&gt;___&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;\&lt;/span&gt;
            &lt;span class="p"&gt;___|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
        &lt;span class="p"&gt;___|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;___|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;___|&lt;/span&gt; &lt;span class="n"&gt;ground&lt;/span&gt;

&lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ground&lt;/span&gt; &lt;span class="n"&gt;floor&lt;/span&gt;

&lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ground&lt;/span&gt; &lt;span class="n"&gt;floor&lt;/span&gt;

&lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="nn"&gt;on&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Functional programming prefers recursive functions over loops because they can be pure functions that call themselves without producing side effects, or at least producing only &lt;strong&gt;external side effects&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A recursive function has two parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base Case&lt;/strong&gt;: Defines the simplest version of the problem, which stops the recursion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursive Case&lt;/strong&gt;: Defines the nth term, how the function calls itself with a smaller input, progressively reducing the problem toward the base case.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;br&gt;
In OCaml, you must explicitly use the &lt;code&gt;rec&lt;/code&gt; keyword when defining a recursive function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; base case *)&lt;/span&gt;
  &lt;span class="kr"&gt;else&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt; &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; recursive case *)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val factorial : int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Breakdown:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base Case&lt;/strong&gt;: The function stops when &lt;code&gt;n = 0&lt;/code&gt;, returning &lt;code&gt;1&lt;/code&gt;. This prevents infinite recursion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursive Case&lt;/strong&gt;: The function calls itself with &lt;code&gt;n - 1&lt;/code&gt;, reducing the problem step by step until it reaches the base case.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Operators As Functions
&lt;/h2&gt;

&lt;p&gt;In OCaml, operators are essentially functions. This means you can use them in the same way you use any other function, allowing for greater flexibility in your code. There are two primary ways to use operators:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Infix Notation&lt;/strong&gt;: This is the typical way operators are used, where the operator is placed between the operands.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;   &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
   &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 6 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prefix Notation&lt;/strong&gt;: By enclosing the operator in parentheses, you can use it as a function, passing the operands as arguments.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;   &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
   &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 6 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits of Using Operators as Functions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Partial Application&lt;/strong&gt;: You can partially apply operators to create new functions.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;  &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add_five&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val add_five : int -&amp;gt; int = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

  &lt;span class="n"&gt;add_five&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
  &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 8 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: Treating operators as functions maintains a consistent functional programming style, making your code more predictable and easier to reason about.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Application Operator
&lt;/h3&gt;

&lt;p&gt;The application operator (&lt;code&gt;@@&lt;/code&gt;) allows you to avoid writing parentheses, making expressions cleaner and easier to read. It is defined as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;@@&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consider the following function and expressions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Result: int = 28, not the desired outcome due to operator precedence *)&lt;/span&gt;

&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Result: int = 22, correct but requires parentheses *)&lt;/span&gt;

&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;@@&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Result: int = 22, using the application operator for clarity *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reverse Application (Pipeline)
&lt;/h3&gt;

&lt;p&gt;The reverse application operator, also known as the pipeline operator (&lt;code&gt;|&amp;gt;&lt;/code&gt;), allows you to write operations from left to right in a more natural and readable manner. It is defined as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;|&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consider the following functions and expressions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;

&lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Result: int = 50625, nested function calls, read from right to left *)&lt;/span&gt;

&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="n"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Result: int = 50625, using the pipeline operator for readability *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  SECTION 2: COMMON DATA STRUCTURES AND OPERATIONS
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Lists
&lt;/h2&gt;

&lt;p&gt;Lists in OCaml provide a simple and efficient way to manage sequences of elements. They are particularly well-suited for functional programming due to their immutability and support for recursive operations. Lists are especially efficient for operations that involve adding or removing elements at the beginning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defining Lists
&lt;/h3&gt;

&lt;p&gt;A list in OCaml is defined using square brackets, with elements separated by semicolons. Lists can contain elements of any type, but all elements in a single list must be of the same type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="p"&gt;[];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : 'a list = [] *)&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int list = [1; 2; 3] *)&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float list = [1.; 2.; 3.] *)&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool list = [true; false; true] *)&lt;/span&gt;

&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int list list = [[1; 2]; [3; 4]; [5; 6]] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The empty list is of type &lt;code&gt;'a list&lt;/code&gt;, where &lt;code&gt;'a&lt;/code&gt; is a &lt;strong&gt;type variable&lt;/strong&gt;. It acts as a generic type that gets specialized based on the elements it contains. More of this in the &lt;code&gt;Parametric Polymorphism&lt;/code&gt; section of this article.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons Operator (&lt;code&gt;::&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Appends an element in front of a list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;::&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int list = [0; 1; 2; 3] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[0; 1; 2; 3]&lt;/code&gt; is a new list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[0; 1; 2; 3]&lt;/code&gt; is syntactic sugar for &lt;code&gt;0 :: 1 :: 2 :: 3 :: []&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the new list, &lt;code&gt;0&lt;/code&gt; is called the &lt;strong&gt;head&lt;/strong&gt;, and &lt;code&gt;[1; 2; 3]&lt;/code&gt; is called the &lt;strong&gt;tail&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Append Operator (&lt;code&gt;@&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Combines two lists into one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;@&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int list = [0; 1; 2; 3] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Module
&lt;/h3&gt;

&lt;p&gt;The List module in OCaml provides a collection of functions to work with lists. Here are some of them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;List.map&lt;/strong&gt;: Applies a given function to each element of a list and returns a new list with the results.&lt;br&gt;&lt;br&gt;
Usage: &lt;code&gt;List.map func list&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int list = [1; 4; 9; 16] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;List.mem&lt;/strong&gt;: Checks whether a given element is a member of a list.&lt;br&gt;&lt;br&gt;
Usage: &lt;code&gt;List.mem element list&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : bool = true *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;List.find&lt;/strong&gt;: Returns the first element of a list that satisfies a given predicate. Throws a &lt;code&gt;Not_found&lt;/code&gt; exception if no such element is found.&lt;br&gt;&lt;br&gt;
Usage: &lt;code&gt;List.find predicate list&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 4 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;List.filter&lt;/strong&gt;: Returns a new list containing only the elements that satisfy a given predicate.&lt;br&gt;&lt;br&gt;
Usage: &lt;code&gt;List.filter predicate list&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int list = [2; 4] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;List.length&lt;/strong&gt;: Returns the length of a list.&lt;br&gt;&lt;br&gt;
Usage: &lt;code&gt;List.length&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 3 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;List.fold_left and List.fold_right&lt;/strong&gt;: Fold functions that reduce a list to a single value using a binary function.&lt;br&gt;&lt;br&gt;
Usage: &lt;code&gt;List.fold_left func acc list&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fold_left&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 10 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Tuples
&lt;/h2&gt;

&lt;p&gt;Tuples are a simple and useful way to aggregate data, which can be of different types. They are especially suitable for temporary groupings or when the order of elements is meaningful.&lt;/p&gt;

&lt;p&gt;Here is how you can define a tuple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"alice@email.com"&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val alice : string * int * string = ("Alice", 30, "alice@email.com") *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optionally, you can specify custom reusable types for your tuples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;person&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"alice@email.com"&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   type person = string * int * string
   val alice : person = ("Alice", 30, "alice@email.com")
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accessing Tuple Elements
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   val name : string = "Alice"
   val age : int = 30
   val email : string = "alice@email.com"
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can use functions like &lt;code&gt;fst&lt;/code&gt; and &lt;code&gt;snd&lt;/code&gt; to access the first and second elements of a pair (a 2-element tuple):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;snd&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   val point : int * int = (1, 3)
   val x : int = 1
   val y : int = 3
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Records
&lt;/h2&gt;

&lt;p&gt;Records are a powerful way to group related data into a single unit with named fields. Unlike tuples, which use positional access, records allow you to access data by field names, making your code more readable and maintainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create the type definition that specifies the names and types of the fields that the record will contain.&lt;/li&gt;
&lt;li&gt;Create instances of that record by specifying values for each field.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;person&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;paolo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"paolo"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"paolo@email.com"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   type person = { name : string; age : int; email : string; }
   val paolo : person = { name = "paolo"; age = 32; email = "paolo@email.com" }
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OCaml automatically knows that &lt;code&gt;paolo&lt;/code&gt; is a &lt;code&gt;person&lt;/code&gt;. You can explicitly state it, but it's not strictly necessary for records.&lt;/p&gt;
&lt;h3&gt;
  
  
  Accessing Record Elements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Direct Access&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="nn"&gt;paolo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "paolo" *)&lt;/span&gt;

&lt;span class="nn"&gt;paolo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 32 *)&lt;/span&gt;

&lt;span class="nn"&gt;paolo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "paolo@email.com" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Destructuring&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paolo&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   val name : string = "paolo"
   val age : int = 32
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  SECTION 3: DIGGING IN OCAML
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Lexical Scope
&lt;/h2&gt;

&lt;p&gt;OCaml adheres to lexical scoping, also known as &lt;strong&gt;static scoping&lt;/strong&gt;. This means that the scope of a variable is determined at compile time based on the structure of the code, rather than at runtime based on the execution context. Lexical scoping simplifies reasoning about code, as it eliminates the need to track the dynamic context, unlike &lt;strong&gt;dynamic scoping&lt;/strong&gt; where the scope is resolved at runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scope for Function Arguments
&lt;/h3&gt;

&lt;p&gt;Function arguments in OCaml are local to the function and cannot be accessed outside its body. Additionally, OCaml function parameters are passed as value copies, not as references to the original arguments. This design prevents unintended modifications to the original data, enhancing both safety and predictability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Locality of Bindings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bindings defined &lt;strong&gt;within a function&lt;/strong&gt; are local to that function and cannot be accessed outside of it.&lt;/li&gt;
&lt;li&gt;Bindings introduced within a &lt;code&gt;let&lt;/code&gt; &lt;strong&gt;expression&lt;/strong&gt; are local to that expression.&lt;/li&gt;
&lt;li&gt;Bindings defined at the &lt;strong&gt;top level&lt;/strong&gt; (global scope) are accessible throughout the module.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lexical Scoping and Closure
&lt;/h3&gt;

&lt;p&gt;OCaml functions can &lt;strong&gt;capture bindings&lt;/strong&gt; from their surrounding scope, even after that scope has exited. This feature, known as a closure, allows functions to retain access to variables from their defining environment. Captured variables are &lt;strong&gt;generally immutable&lt;/strong&gt; within the closure, ensuring consistency across different function executions. This immutability reduces &lt;strong&gt;shared-state complexity&lt;/strong&gt; and helps prevent race conditions in concurrent programs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Parametric Polymorphism
&lt;/h2&gt;

&lt;p&gt;Parametric polymorphism is a way to write generic, type-agnostic code. This is achieved using &lt;em&gt;Type Variables&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type Variables
&lt;/h3&gt;

&lt;p&gt;Type variables are placeholders for types. They allow you to define functions and data structures that can operate on any type. In OCaml, type variables are typically denoted by single letters like &lt;code&gt;'a&lt;/code&gt;, &lt;code&gt;'b&lt;/code&gt;, etc., often read as &lt;em&gt;alpha&lt;/em&gt;, &lt;em&gt;beta&lt;/em&gt;, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;identity&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val identity : 'a -&amp;gt; 'a *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Here, &lt;code&gt;'a&lt;/code&gt; (alpha) is a &lt;em&gt;type variable&lt;/em&gt; representing an unknown type in OCaml.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This &lt;em&gt;type variable&lt;/em&gt; allows the identity function to operate on values of any type, making it a polymorphic function.&lt;/p&gt;

&lt;p&gt;Maybe you remember the type definition of the empty list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="p"&gt;[];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : 'a list = [] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here it's saying: "I'm a list that can be of any type", but it gets specialized when it receives elements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="s2"&gt;"hola"&lt;/span&gt; &lt;span class="n"&gt;::&lt;/span&gt; &lt;span class="p"&gt;[];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string list = ["hola"] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Aliases
&lt;/h2&gt;

&lt;p&gt;Like values you can give name to types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;point&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; type point = float * float *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val p1 : point = (1., 2.) *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Variants
&lt;/h2&gt;

&lt;p&gt;OCaml supports features called &lt;strong&gt;variants&lt;/strong&gt; or &lt;strong&gt;algebraic data types&lt;/strong&gt; (ADTs) that are very similar to &lt;strong&gt;enums&lt;/strong&gt; in other languages. Variants are used to define types that can take on different forms, allowing you to create new type definitions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;primary_color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Red&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Green&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Blue&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; type primary_color = Red | Green | Blue *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val r : primary_color = Red *)&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Green&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val g : primary_color = Green *)&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Blue&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val b : primary_color = Blue *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we are defining a custom type &lt;code&gt;primary_color&lt;/code&gt; that can be one of three options: &lt;code&gt;Red&lt;/code&gt;, &lt;code&gt;Green&lt;/code&gt; and &lt;code&gt;Blue&lt;/code&gt;. These options are called &lt;strong&gt;contructors&lt;/strong&gt; and serve as &lt;em&gt;custom tags&lt;/em&gt;. In the first examples, we are binding one of those tags to a name and doing so the compiler interpret those bindings as types from &lt;strong&gt;primary_color&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Constructors can optionally carry data, allowing you to create more complex data structures. Let's see the next example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;                     &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; A point with no additional data *)&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;             &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Circle with a radius *)&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; Rectangle with width and height *)&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; type shape = Circle of float | Rectangle of float * float | Point *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val p : shape = Point *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val c : shape = Circle 5. *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val r : shape = Rectangle (3., 4.) *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Circle&lt;/code&gt;, &lt;code&gt;Rectangle&lt;/code&gt;, and &lt;code&gt;Point&lt;/code&gt; are the &lt;em&gt;variant constructors&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Point&lt;/code&gt; carries no additional data (similar to the &lt;em&gt;primary_color&lt;/em&gt; example).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Circle&lt;/code&gt; carries a single float value representing the &lt;em&gt;radius&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Rectangle&lt;/code&gt; carries two float values representing the &lt;em&gt;width&lt;/em&gt; and &lt;em&gt;height&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Constructors as you can see allow you to create new values from a variant type, different definition from constructors in OOP (Object Oriented Programming), which also contains methods.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pattern Matching
&lt;/h2&gt;

&lt;p&gt;Pattern matching allows you to inspect the structure of data and extract values in a concise and expressive way. It's particularly useful for working with algebraic data types, such as variants and tuples. Pattern matching allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Match against values (pretty similar to switch cases)&lt;/li&gt;
&lt;li&gt;Match against the shape of the data&lt;/li&gt;
&lt;li&gt;Extract parts of the data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Syntax
&lt;/h3&gt;

&lt;p&gt;The basic syntax for pattern matching in OCaml is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;fun_name&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;pattern1&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result1&lt;/span&gt; &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; we call this a branch *)&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;pattern2&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; or its equivalent syntactic sugar *)&lt;/span&gt;
&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;fun_name&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;pattern1&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result1&lt;/span&gt; &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; we call this a branch *)&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;pattern2&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;expression&lt;/strong&gt; is the value you want to match against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pattern1&lt;/strong&gt;, &lt;strong&gt;pattern2&lt;/strong&gt;, etc., describe the shape of the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;result1&lt;/strong&gt;, &lt;strong&gt;result2&lt;/strong&gt;, etc., are the returned expressions if the corresponding pattern matches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Side Note:&lt;/strong&gt;&lt;br&gt;
The entire match expression must be type-consistent, meaning all branches must return values of the same type, just like OCaml’s if expressions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Matching on Values
&lt;/h3&gt;

&lt;p&gt;Pattern matching on values are very similar to switch cases but more powerful. In fact understanding switch cases is a good place to start.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;describe_number&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Zero"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"One"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Some other number"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val describe_number : int -&amp;gt; string = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;describe_number&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "One" *)&lt;/span&gt;

&lt;span class="n"&gt;describe_number&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "Some other number" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function &lt;code&gt;describe_number&lt;/code&gt; takes an integer &lt;code&gt;x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It matches &lt;code&gt;x&lt;/code&gt; against several patterns: &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;, and &lt;code&gt;_&lt;/code&gt; which is a wildcard pattern that matches anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  More Powerful than Switch Cases
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Allows you to match not just on values but also on the structure of data.&lt;/li&gt;
&lt;li&gt;Can warn you if you haven't covered all possible cases.&lt;/li&gt;
&lt;li&gt;Often results in shorter and more readable code.&lt;/li&gt;
&lt;li&gt;Does not have fall-through behavior, where forgetting a break statement can lead to unintended execution of subsequent cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Matching on Lists
&lt;/h3&gt;

&lt;p&gt;Lists can only be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nil (&lt;code&gt;[]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;the cons of an elemnt onto another list (&lt;code&gt;h :: t&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we can pattern match against those to ways:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"empty"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;::&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val first_element : string list -&amp;gt; string = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="p"&gt;[];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "empty" *)&lt;/span&gt;

&lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sapori"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="s2"&gt;"colori"&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "sapori" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function &lt;code&gt;get_first_element&lt;/code&gt; takes a list &lt;code&gt;lst&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It matches the list against several patterns:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[]&lt;/code&gt; (empty list) → returns "empty".&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[x]&lt;/code&gt; (single-element list) → returns &lt;code&gt;x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h :: _&lt;/code&gt; (non-empty list) → returns the first element &lt;code&gt;h&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Side Note:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In fact, pattern matching is type exaustive, preventing to write runtime error prone code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first_element&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"empty"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
  [partial-match]: this pattern-matching is not exhaustive.
  Here is an example of a case that is not matched:
  _::_

  val first_element : 'a list -&amp;gt; string = &amp;lt;fun&amp;gt;
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Matching on Tuples
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;has_zero&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Both are zero"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;_)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"First is zero"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(_,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Second is zero"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"None is zero"&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val has_zero : int * int -&amp;gt; string = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;has_zero&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "None is zero" *)&lt;/span&gt;

&lt;span class="n"&gt;has_zero&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "First is zero" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function &lt;code&gt;has_zero&lt;/code&gt; takes a tuple &lt;code&gt;(x, y)&lt;/code&gt; and matches it against specific patterns to determine whether any of the values are zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: Matching on Records
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;student&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;grad_year&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;giorgio&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Giorgio Rosa"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;grad_year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1950&lt;/span&gt;
&lt;span class="p"&gt;};;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
  type student = { name : string; grad_year : int; }
  val giorgio : student = {name = "Giorgio Rosa"; grad_year = 1950}
 *)&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;name_with_year&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;grad_year&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;^&lt;/span&gt; &lt;span class="s2"&gt;", graduated in "&lt;/span&gt; &lt;span class="n"&gt;^&lt;/span&gt; &lt;span class="nn"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt; &lt;span class="n"&gt;grad_year&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; val name_with_year : student -&amp;gt; string = &amp;lt;fun&amp;gt; *)&lt;/span&gt;

&lt;span class="n"&gt;name_with_year&lt;/span&gt; &lt;span class="n"&gt;giorgio&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : string = "Giorgio Rosa, graduated in 1950" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example: Matching on Variants
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="n"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   type shape = Circle of float | Rectangle of float * float
   val area : shape -&amp;gt; float = &amp;lt;fun&amp;gt;
 *)&lt;/span&gt;

&lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 28.27... *)&lt;/span&gt;
&lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 8. *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;shape&lt;/code&gt; type has two variants: &lt;code&gt;Circle&lt;/code&gt; and &lt;code&gt;Rectangle&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The function &lt;code&gt;area&lt;/code&gt; matches on the shape and extracts the relevant data:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Circle radius&lt;/code&gt; → computes the area as π * radius².&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Rectangle (width, height)&lt;/code&gt; → computes the area as width * height.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: Nested Patterns
&lt;/h3&gt;

&lt;p&gt;Let's calculate the area of shapes when we have its cartesian points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;point&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;

&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;lower_left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;upper_right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="n"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;lower_left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;upper_right&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_lf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_lf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lower_left&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt;
      &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_ur&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_ur&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;upper_right&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_ur&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;x_lf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_ur&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;y_lf&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   type point = float * float
   type shape =
     Circle of { center : point; radius : float; }
   | Rectangle of { lower_left : point; upper_right : point; }
   val area : shape -&amp;gt; float = &amp;lt;fun&amp;gt;
 *)&lt;/span&gt;

&lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="p"&gt;};;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 3.14159265358979312 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case we are extracting data from the record of a variant constructor but we can pattern match even more :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;point&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;

&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;lower_left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;upper_right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="n"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;lower_left&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_lf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_lf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;upper_right&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_ur&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_ur&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_ur&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;x_lf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_ur&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;y_lf&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Function Keyword
&lt;/h2&gt;

&lt;p&gt;You can simplify the syntax of functions that use pattern matching by leveraging the &lt;code&gt;function&lt;/code&gt; keyword. This keyword allows you to leave off the last argument and the beginning of the match expression, making your code more concise and readable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplifying with &lt;code&gt;function&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Consider the following function definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="kr"&gt;with&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can rewrite it using the &lt;code&gt;function&lt;/code&gt; keyword to streamline the pattern matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's take the previous example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt;

&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;    &lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; see the change here *)&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="n"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="n"&gt;*&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt;
   type shape = Circle of float | Rectangle of float * float
   val area : shape -&amp;gt; float = &amp;lt;fun&amp;gt;
 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type Definition&lt;/strong&gt;: The &lt;code&gt;shape&lt;/code&gt; type is a variant that can represent either a &lt;code&gt;Circle&lt;/code&gt; with a radius or a &lt;code&gt;Rectangle&lt;/code&gt; with width and height.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Function Definition&lt;/strong&gt;: The &lt;code&gt;area&lt;/code&gt; function uses the &lt;code&gt;function&lt;/code&gt; keyword to directly pattern match on the &lt;code&gt;shape&lt;/code&gt; type. This eliminates the need for an explicit match expression.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 28.27... *)&lt;/span&gt;
&lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="n"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;);;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : float = 8. *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example: Summing a List&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's another example that demonstrates the use of the &lt;code&gt;function&lt;/code&gt; keyword with a recursive function to sum the elements of a list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
 &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
 &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;::&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function Definition&lt;/strong&gt;: The &lt;code&gt;sum&lt;/code&gt; function uses the &lt;code&gt;function&lt;/code&gt; keyword to pattern match on the list. If the list is empty (&lt;code&gt;[]&lt;/code&gt;), it returns &lt;code&gt;0&lt;/code&gt;. Otherwise, it adds the head (&lt;code&gt;h&lt;/code&gt;) to the sum of the tail (&lt;code&gt;t&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];;&lt;/span&gt;
&lt;span class="c"&gt;(*&lt;/span&gt;&lt;span class="cm"&gt; : int = 10 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Congratulations
&lt;/h1&gt;

&lt;p&gt;You've arrived at the final part of the article. Now you have the big picture of OCaml and can write your own code!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfhzszl6sgv3kipaqrrf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfhzszl6sgv3kipaqrrf.gif" alt="Now you have powers!" width="480" height="240"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Next Steps
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;If you want to dig more into OCaml particularities visit the second part &lt;a href="https://dev.to/david2am/practical-ocaml-1h71"&gt;Practical OCaml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ocaml</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Functional Programming and Why OCaml?</title>
      <dc:creator>david2am</dc:creator>
      <pubDate>Wed, 02 Apr 2025 22:19:54 +0000</pubDate>
      <link>https://forem.com/david2am/functional-programming-and-why-ocaml-2eon</link>
      <guid>https://forem.com/david2am/functional-programming-and-why-ocaml-2eon</guid>
      <description>&lt;p&gt;I'd like to express my gratitude to Richard Feldman for his incredible teachings in Functional Programming and to Professor Michael Ryan Clarkson for creating such a wonderful OCaml's course.&lt;/p&gt;

&lt;p&gt;With this guide, I hope to contribute to the community by showcasing the beauty and practicality of functional programming, emphasizing that it's &lt;em&gt;different&lt;/em&gt;, not difficult. There's a lack of beginner-friendly tutorials out there, and I aim to fill that gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ztY1YRiaSiE&amp;amp;t=1803s" rel="noopener noreferrer"&gt;Distributed Pure Functions by Richard Feldman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=QyJZzq0v7Z4&amp;amp;t=1s" rel="noopener noreferrer"&gt;Why Isn't Functional Programming the Norm?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MUcka_SvhLw&amp;amp;list=PLre5AT9JnKShBOPeuiD9b-I4XROIJhkIU" rel="noopener noreferrer"&gt;OCaml Programming: Correct + Efficient + Beautiful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=spwvg0DThh4&amp;amp;t=46s" rel="noopener noreferrer"&gt;Intro to OCaml + Functional Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=3n17wHe5wEw&amp;amp;t=288s" rel="noopener noreferrer"&gt;Functional Programming for Pragmatists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=UOkOA6W-vwc" rel="noopener noreferrer"&gt;Ditch your Favorite Programming Paradigm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Imperative vs Declarative Programming&lt;/li&gt;
&lt;li&gt;Functional Programming Basics&lt;/li&gt;
&lt;li&gt;Implementations of FP in a Language&lt;/li&gt;
&lt;li&gt;Concurrency and Parallelism the Places where FP Shines&lt;/li&gt;
&lt;li&gt;OCaml&lt;/li&gt;
&lt;li&gt;Next Steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy reading! 🚀&lt;/p&gt;




&lt;h1&gt;
  
  
  Imperative vs Declarative Programming
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Think of it like cooking:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Imperative programming&lt;/strong&gt; is like giving detailed step-by-step cooking instructions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take out a pan&lt;/li&gt;
&lt;li&gt;Heat it to medium&lt;/li&gt;
&lt;li&gt;Add 1 tablespoon of oil&lt;/li&gt;
&lt;li&gt;Crack 2 eggs into the pan&lt;/li&gt;
&lt;li&gt;Stir for 2 minutes&lt;/li&gt;
&lt;li&gt;Add salt and pepper&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Declarative programming&lt;/strong&gt; is like saying "Make me scrambled eggs, please" - you specify &lt;em&gt;what&lt;/em&gt; you want, not &lt;em&gt;how&lt;/em&gt; to do it.&lt;/p&gt;

&lt;p&gt;Functional Programming (FP) is a declarative way of writing programs. It focuses on telling the computer &lt;em&gt;what&lt;/em&gt; result you want, hiding the detailed mechanics of &lt;em&gt;how&lt;/em&gt; to get there.&lt;/p&gt;

&lt;p&gt;This makes your code more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expressive&lt;/li&gt;
&lt;li&gt;Easy to read&lt;/li&gt;
&lt;li&gt;Easier to maintain&lt;/li&gt;
&lt;li&gt;More focused on solving problems than implementation details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;br&gt;&lt;br&gt;
 Some may be concerned that the higher level of abstraction in functional programming (FP) could lead to slower programs. However, this is not always the case. For instance, OCaml, a functional language, can achieve performance comparable to that of C.&lt;/p&gt;


&lt;h1&gt;
  
  
  Functional Programming Basics
&lt;/h1&gt;

&lt;p&gt;Like math formulas, expressions evaluate to values. In FP, everything is an expression, including functions, so programs are just compositions of expressions, rather than instructions, as in imperative programming.&lt;/p&gt;
&lt;h3&gt;
  
  
  Core Principles of FP
&lt;/h3&gt;

&lt;p&gt;✅ No Side Effects&lt;br&gt;&lt;br&gt;
✅ No Shared State&lt;br&gt;&lt;br&gt;
✅ Immutable Data&lt;/p&gt;
&lt;h2&gt;
  
  
  No Side Effects
&lt;/h2&gt;

&lt;p&gt;In general, there are 2 types of side effects &lt;em&gt;external&lt;/em&gt; and &lt;em&gt;internal&lt;/em&gt;. &lt;em&gt;External side effects&lt;/em&gt; occurs when a program interacts with the external world, such as reading from a file, writing to a database, or displaying output. On the other hand, &lt;em&gt;internal side effects&lt;/em&gt; occurs when a code entity (function, method, object, etc.) mutate state outside its own scope.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;            outside
              |
outside &lt;span class="nt"&gt;&amp;lt;-&lt;/span&gt;  &lt;span class="na"&gt;SYSTEM&lt;/span&gt;  &lt;span class="na"&gt;-&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; outside
              |
            outside
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FP discourage the use of &lt;em&gt;internal side effects&lt;/em&gt; because they can lead to unexpected behaviors. In another hand, &lt;em&gt;external side effects&lt;/em&gt; are unavoidable because are necessary to interact with the real world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Function with side effect - prints to console *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;print_string&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello, "&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="s2"&gt;"!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;(* Pure function - no side effect *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="s2"&gt;"Hello, "&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="s2"&gt;"!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  No Shared State
&lt;/h2&gt;

&lt;p&gt;Expressions do not share state directly; instead, they operate on copies of data, ensuring modifications in one of them don't generate side effects in another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Define a function that takes a list and returns a new list with an element added *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add_element&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Immutable Data
&lt;/h2&gt;

&lt;p&gt;In functional programming, data is immutable, meaning it cannot be changed once created. If updates are necessary, new versions of the data are generated. Since each expression operates on a copy, internal operations do not affect the original data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Immutable list operations *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;     &lt;span class="c"&gt;(* Creates new list [0; 1; 2; 3] *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;mapped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;  &lt;span class="c"&gt;(* Creates new list [2; 4; 6] *)&lt;/span&gt;

&lt;span class="c"&gt;(* Original list remains unchanged *)&lt;/span&gt;
&lt;span class="c"&gt;(* numbers is still [1; 2; 3] *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Implementations of FP in a Language
&lt;/h1&gt;

&lt;p&gt;To apply those principles FP uses:&lt;/p&gt;

&lt;p&gt;✅ * &lt;strong&gt;Expressions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ * &lt;strong&gt;Lexical Scope&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Pure Functions&lt;br&gt;&lt;br&gt;
✅ First-Class Functions  &lt;/p&gt;

&lt;p&gt;FP revolves around the use of &lt;strong&gt;expressions&lt;/strong&gt; and &lt;strong&gt;lexical scope&lt;/strong&gt;. Pure functions and closures are natural byproducts of expressions and well-defined scope.  &lt;/p&gt;

&lt;p&gt;While not covered here, these concepts also serve as the foundation of recursion, partial applications (or currying), lazy evaluation and more, which we will explore in depth in a future article.&lt;/p&gt;
&lt;h2&gt;
  
  
  Expressions
&lt;/h2&gt;

&lt;p&gt;Expressions are code constructs that evaluate to a value without altering the program's state. In FP, even control structures like if-then-else return values!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Pseudocode for expressions *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;val1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;expression_1&lt;/span&gt; &lt;span class="c"&gt;(* evaluates to a value *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;val2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;expression_2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;(* expression_2 uses copies of val1 without modifying them *)&lt;/span&gt;


&lt;span class="c"&gt;(* Pseudocode for instructions *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;val1&lt;/span&gt; &lt;span class="c"&gt;(* value declaration *)&lt;/span&gt;

&lt;span class="n"&gt;computation_1&lt;/span&gt; &lt;span class="c"&gt;(* modifies val1 *)&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;val2&lt;/span&gt; &lt;span class="c"&gt;(* value declaration *)&lt;/span&gt;

&lt;span class="n"&gt;computation_2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;(* modifies val2 *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As illustrated, traditional computations can lead to side effects, making code harder to maintain. On the other hand, expressions always return values, &lt;strong&gt;encouraging&lt;/strong&gt; that evaluation take place outside their scope, avoiding mutations and side effects on other internal scopes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lexical Scope
&lt;/h2&gt;

&lt;p&gt;In lexical scoping, the scope of a variable is determined by its location within the source code, specifically where it is declared. This means that the scope is resolved at compile time based on the structure of the code, rather than at runtime based on the execution context, which makes it easier to reason about in comparison with dynamic scoping for example.&lt;/p&gt;

&lt;h3&gt;
  
  
  Function Parameters
&lt;/h3&gt;

&lt;p&gt;Internally, they act as value copies rather than references to the original arguments. This prevents unintended modifications to the original data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local variables and immutability
&lt;/h3&gt;

&lt;p&gt;Variables declared within a specific scope (such as inside a function) are intended to be immutable, reinforcing predictability and referential transparency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lexical Scoping and Closure
&lt;/h3&gt;

&lt;p&gt;When a higher-order function creates a closure, it captures variables from its surrounding scope. These captured variables are usually treated as immutable within the closure, ensuring they remain consistent across different function executions. This also helps prevent unexpected modifications from other parts of the program, reducing shared-state complexity and race conditions in concurrent execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pure Functions
&lt;/h2&gt;

&lt;p&gt;Pure functions always produce the same output for the same input and have no side effects - just like mathematical functions!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Pure function *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="c"&gt;(* Always returns 16 *)&lt;/span&gt;
&lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, are expressions that &lt;strong&gt;have no&lt;/strong&gt; side effects at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  First-Class Functions
&lt;/h2&gt;

&lt;p&gt;In functional programming, functions are a special type of value. This means they can be passed as arguments, returned from other functions, and assigned to variables. Functions that take other functions as arguments or return functions as results are called &lt;strong&gt;higher-order functions&lt;/strong&gt;. These enable function composition and closure creation, which, as discussed earlier, establish their own scope and help avoid shared state between entities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* A function that takes another function as input *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;apply_twice&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;(* Passing different functions to apply_twice *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apply_twice&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;    &lt;span class="c"&gt;(* Returns 12 *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apply_twice&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="s2"&gt;"!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"hi"&lt;/span&gt;  &lt;span class="c"&gt;(* Returns "hi!!" *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Concurrency and Parallelism the Places where FP Shines
&lt;/h1&gt;

&lt;p&gt;Whenever you need better fault tolerance and availability you need concurrency and/or parallelization, and their best fit is FP because it offers:&lt;/p&gt;

&lt;p&gt;✅ Safe Parallelization&lt;br&gt;&lt;br&gt;
✅ Safe Data Sharing&lt;br&gt;&lt;br&gt;
✅ Sage Threads&lt;/p&gt;
&lt;h2&gt;
  
  
  Safe Parallelization
&lt;/h2&gt;

&lt;p&gt;Since FP avoids side effects, operations can run independently over iterable data structures, such as arrays, tuples, etc, without fearing unexpected behaviors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Can safely run parallel_function_expression independently over each list element because no shared state is modified *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;processed_customers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
  &lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parallel_function_expression&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Safe Data Sharing
&lt;/h2&gt;

&lt;p&gt;Since data is immutable (unchangeable), it can be safely shared across different parts of your program.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* This data can be shared safely across threads *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s2"&gt;"timeout"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"30"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"retries"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c"&gt;(* Every thread can access 'data' without worrying about it changing *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Thread Safety
&lt;/h2&gt;

&lt;p&gt;Immutable data prevents race conditions (where multiple threads try to modify the same data simultaneously).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
In languages with mutable data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Potential race condition if two threads run this
&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In functional programming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* No race condition - creates new value instead of modifying *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;new_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Ocaml
&lt;/h1&gt;

&lt;p&gt;OCaml's approach makes functional programming both powerful and accessible. While it may differ from what you're used to, with practice, it becomes an intuitive and effective way to write clean, reliable code!&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Choose OCaml for Functional Programming?
&lt;/h3&gt;

&lt;p&gt;✅ Balanced FP&lt;br&gt;&lt;br&gt;
✅ Correctness&lt;br&gt;&lt;br&gt;
✅ Speed (as fast as C)  &lt;/p&gt;
&lt;h2&gt;
  
  
  Balanced FP
&lt;/h2&gt;

&lt;p&gt;OCaml allows mutation when it's truly necessary. For specific use cases, creating a long data list every time a change is needed can be inefficient. Therefore, OCaml allows you to prioritize performance over dogmatic adherence to immutability:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* Imperative style with shared state *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="bp"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c"&gt;(* Functional style - no shared state *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But OCaml still adheres to FP principles:&lt;br&gt;&lt;br&gt;
✔︎ No Side Effects&lt;br&gt;&lt;br&gt;
✔︎ No Shared State&lt;br&gt;&lt;br&gt;
✔︎ Immutable Data &lt;/p&gt;

&lt;p&gt;An also their advantage for fault tolerance and high availability systems are maintained:&lt;br&gt;&lt;br&gt;
✔︎ Safe Parallelization&lt;br&gt;&lt;br&gt;
✔︎ Safe Data Sharing&lt;br&gt;&lt;br&gt;
✔︎ Safe Threads&lt;/p&gt;
&lt;h2&gt;
  
  
  Correctness
&lt;/h2&gt;

&lt;p&gt;OCaml's strong type system adds an extra layer to detect errors at compile time, preventing security vulnerabilities and enhancing code clarity and readability. It is so powerful that you often don't need to explicitly define every type; the compiler can infer types from your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="c"&gt;(* OCaml won't let this run. The '+' operator works with numbers, not strings, so `x` is expected to be a number. *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;buggy&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt;  &lt;span class="c"&gt;(* Type error! *)&lt;/span&gt;

&lt;span class="c"&gt;(* The type system helps you write correct code. *)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;safe_concat&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;string_of_int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt;  &lt;span class="c"&gt;(* Works correctly *)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As demonstrated, explicit type definitions are often unnecessary due to OCaml's type inference capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed
&lt;/h2&gt;

&lt;p&gt;OCaml is renowned for its performance, often achieving speeds comparable to C. This makes it an excellent choice for applications where efficiency is critical.&lt;/p&gt;

&lt;h2&gt;
  
  
  🟣 Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you want to explore and build your first OCaml project visit my tutorial &lt;a href="https://dev.to/david2am/ocamldune-tutorial-5688" rel="noopener noreferrer"&gt;OCaml/Dune&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;If you want to explore OCaml syntax visit my tutorial &lt;a href="https://dev.to/david2am/basic-ocaml-2j0g" rel="noopener noreferrer"&gt;Basic OCaml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>ocaml</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
