F Sharp

programmeringsspråk

F# (uttalt som F Sharp) er et funksjonelt programmeringsspråk utviklet av Microsoft med Don Syme som hovedarkitekt. F# kan bli kalt et hybridspråk, da det ikke er et rent funksjonelt programmeringsspråk, men forener flere typer paradigmer, deriblant imperativ og objektorientert programmering. Syntaksmessig er F# stort sett kompatibelt med OCaml, et språk i ML-familien.

F Sharp
Tilblivelse2005
Paradigme
Designet avDon Syme, Microsoft Research
Utviklet avMicrosoft, F Sharp Software Foundation
Siste versjon(er)7.0 / 8. nov. 2022
Typetildeling statisk, sterk, inferens
Filendelse(r).fs, .fsi, .fsx, .fsscript
OSmultiplattform
LisensApache-lisensen
Påvirket av
MetaLanguage, Objective Caml, C#, Erlang, Haskell, Python, Scala

I likhet med flere språk utviklet av Microsoft har man gjennom F# tilgang til hele .NET-rammeverket. Dette gjør at man kan drive utvikling på samme plan i F# som i C# og Visual Basic.

Historie rediger

Don Syme i Microsoft Research brukte 5 år på å utforske muligheten til å implementere et funksjonelt programmeringsspråk som siktet seg inn på .NET-rammeverket. En av hovedgrunnene til Microsofts investering i F# var å nå inn i nye domener som deres tidligere språk ikke har vært innblandet i, blant annet vitenskapelige og matematiske områder. Simon Peyton Jones, en av de største bidragsyterne til programmeringsspråket Haskell og kollega av Don Syme, var en nøkkelperson i utviklingen av asynkrone arbeidsforløp i F#.

Syntaks rediger

Syntaksmessig tar F# veldig mye fra OCaml, og flere av språkutviklerne for OCaml ble brukt som ressurser i utviklingen av F#. F# låner også ideer fra flere andre funksjonelle språk, som Haskell, men også fra imperative og objektorienterte språk som C# og Python.

F# tar i bruk sterk typesetting og implisitt typededuksjon. Som resultat kan man velge hvorvidt man ønsker å spesifikt definere type, eller om kompilatoren skal undersøke det selv. I enkelte tilfeller kan det være en fordel å spesifisere hvilke type man ønsker å bruke for å være sikker på at inndata kommer i den typen man ønsker, og utdata blir levert av samme grunn. Dermed kan man tidlig oppdage feil som man ellers ikke ville funnet før etter kompilering.

I F# er alle variabler i utgangspunktet uforanderlige. Hvis utvikleren ønsker det, kan dette omgås ved å bruke mutable nøkkelordet.

Hello World rediger

En liten sammenligning av et Hello World-program i F# og et tilsvarende i OCaml, med kommentarer og variabeldeklarasjon:

(* Dette er en kommentar og eksempel i F# *)
let variabel = "Hello World"
printfn "%s" variabel


(* Dette er en kommentar og eksempel i OCaml*)
let variabel = "Hello world"
print_string variabel

Currying rediger

Både variabler og funksjoner er verdier i F#. Dette gjør at man kan bruke ufullstendige funksjoner og currying på funksjoner. Et lite eksempel på currying i F#:

open System.Windows.Forms
let msgbox tittel innhold = MessageBox.Show(innhold, tittel)

let delvisMsgBox = msgbox "Dette er tittelen"
delvisMsgBox "Dette er innholdet"

Lat evaluering rediger

Som standard blir F# lest og evaluert fra topp til bunn, men ved å bruke lazy-nøkkelordet kan man bruke lat evaluering, slik at koden ikke blir evaluert før man absolutt vil det. Et eksempel på nytten av lat evaluering kan være hvis man ønsker å kalkulere store tall som man ikke vil bruke tid og prosessorkraft på før det faktisk trengs.

Siden F# blir lest fra topp til bunn, vil første eksempel i koden nedenfor feile. fordi Først evalueres createDir, som oppretter mappen "Mappenavn", deretter vil den igjen prøve å skape den samme mappen når if-uttrykket blir evaluert som sant. I det neste eksemplet blir ikke funksjonen createDir evaluert og mappen opprettet før if-uttrykket blir evaluert som sant i den tredje kodelinjen.

(** Med ivrig evaluering **)
let skalOpprette = true
let createDir = Directory.CreateDirectory(@"C:\Mappenavn")
if skalOpprette then createDir else failwith "Ikke opprettet"


(** Med lat evaluering **)
let skalOpprette = true
let createDir = lazy( Directory.CreateDirectory(@"C:\Mappenavn") )
if skalOpprette then createDir.Force() else failwith "Ikke opprettet"

Eksterne lenker rediger