Kodesnutt.io

Lær funksjonell tankegang med OCaml

En serie med 18 korte videoer som går igjennom sentrale konsepter i funksjonell programmering i ML-språk. Alt fra typer, currying, pattern matching og rekursjon.

Start nå

START

SLUTT

Oppsett av maskin

Vi introduserer serien i for Kodesnutt hvor vi skal lære oss det funksjonelle språket OCaml.

I første episoden ser vi på hvordan vi kan sette opp maskinen for å kjøre kode. Vi ser på REPL, merlin og hvordan man kan sette det opp i VSCode.

Print & Semikolon

Semikolon er kanskje en interessant greie med OCaml, da man noen ganger bruker det dobbelt opp med “;;”. Hvorfor det?

Vi skal og se hvordan vi kan printe ut til konsollen.

Primitive datatyper

I denne episoden ser vi på hvilke primitive datatyper som eksisterer i språket, og ser litt på hvordan operasjoner fungerer på typene.

Funksjoner

Vi ser på et ganske sentralt konsept i funksjonelle språk: Funksjoner.

Hvordan definerer vi funksjoner, og hvordan fungerer de?

Automatisk uthenting av typer

Det kan jo bli veldig slitsomt om vi må eksplisitt si hva slags type absolutt alt er. Heldigvis er OCaml veldig flink til å finne ut av det selv og sette typene for oss.

I denne episoden ser vi på det konseptet, ofte kalt “inferring types”.

Manuelle typer for funksjoner

Forrige episode så vi på hvordan vi i stor grad kan overlate typer til å bli automatisk kalkulert av OCaml-kompilatoren. Men noen ganger så ønsker vi å sette dette eksplisitt og manuelt.

Vi har sett på hvordan det kan gjøres med variabler, men hvordan kan vi sette eksplisitte typer for funksjoner?

Invokasjon av funksjoner

Alle funksjoner i OCaml er implisitt curried. Det betyr at om vi ikke oppfyller alle argumentene, så vil det returneres en ny implisitt curried funksjon som tar færre argumenter – helt til parameterlisten er komplett.

I denne delen av OCaml-serien ser vi på hvordan dette funker i OCaml.

Infiksfunksjoner og operasjoner

I ML-baserte språk som OCaml, kan man spesifisere sin egne operasjoner, eller funksjoner som blir kalt mellom argumenter fremfor prefikset. Det betyr at operasjoner i språket er funksjoner som alt annet. I denne episoden ser vi på hvordan det fungerer og hvordan vi kan spesifisere egne infiks-funksjoner.

Vi skal og se på hvordan vi kan bestemme presendens uten å bruke paranteser.

Lister

Det er også lister i OCaml. Det er kanskje implementert på en litt morsom måte med bruk av en “cons operator”.

I denne episoden ser vi på hvordan lister fungerer i OCaml og hvordan vi kan bruke de til å holde på informasjon.

Tupler

I forrige episode så vi på hvordan vi kan bruke lister til å gruppere informasjon. Men lister kan ikke holde på informasjon av miksede typer.

Det kan derimot tupler! I denne episoden ser vi på hva tupler er og hvordan vi kan bruke de som lommer av informasjon.

Records og typealiaser

Man kommer ganske langt med lister og tupler, men noen ganger vil man ha informasjon i en mer strukturert form.

I OCaml har man records som kan ligne på objekter fra språk som JavaScript, men de er immutable og value types. Hva det betyr kan vi se på i ukas episode!

Varianter og typekonstruktører

I OCaml (og andre ML-baserte språk) har man noe kalt varianter (eller union types) og typekonstruktører. En veldig kraftig type-måte som gjør at språket kan bli svært fleksibelt. I enkleste form virker det som enums, men i avansert bruk kan det brukes til å f.eks implementere lenkede lister.

I denne episoden ser vi på hvordan dette fungerer og hvordan vi kan bruke det til å implementere en maybe type som sikrer oss mot feil som null reference exceptions.

Pattern matching av options

ML-baserte språk (og andre) har gjerne en form for pattern matching innebygd. En veldig nyttig språkegenskap for å finne igjen verdier i konstruksjoner eller som rene verdier. Det fungerer særlig godt med varianter som vi så på i forrige episode.

I denne episoden ser vi på hvordan vi kan bruke pattern matching for å bruke maybes/options og pakke ut verdier.

Pattern matching av variants og literals

Vi fortsetter å se på det sentrale konseptet i OCaml: Pattern Matching. I forrige episode så vi hvordan vi kunne pakke ut verdier fra options (eller maybes om du vil).

I denne episoden skal vi se mer på generell pattern matching av varianter og av literals (strenger, ints osv).

Pattern matching av records

Fortsettelse av pattern matching i OCaml. Vi utforsker mer av hva vi kan bruke det til og ser at vi og kan kombinere destrukturering av records med pattern matching.

En måte å matche på spesifikke records og hente ut data i samme slengen. Dette gjør at uthenting av info kan være ganske deklerativt og pattern matching hjelper oss til å unngå fallgruver med ikke-matchende caser.

Pattern matching med when

Enda en fortsettelse hvor vi dykker litt i egenskapene til pattern matching i OCaml. I denne episoden ser vi på hvordan vi kan matche med records, men samtidig luke ut mer ved bruk av conditionals via nøkkelordet when.

Pattern matching av lister

I OCaml er lister en kul konstruksjon. Faktisk er det et type-konstruksjon, implementert som en varians med en rekursiv infiks konstruktør. Og det kan selvfølgelig pattern matches og destruktureres.

I nest siste episode av serien ser vi på hvordan vi kan hente ut info fra lister.

Records og typealiaser

Dette er siste episode i serien. Nå har vi kommet ganske langt i å lære oss basisen av språket OCaml, og hvordan vi kan tenke funksjonelt.

I denne episoden ser vi på litt mer kode. Nå ser vi på hvordan vi kan splitte opp problem til subset av problem med rekursjon: Funksjoner som kaller seg selv. Et konsept som er ganske vanlig i funksjonelle språk.

I tillegg vil vi se på hvordan vi kan bruke liste-iteratorer og debugger i VSCode.