F Sharp

Fra Wikipedia, den frie encyklopedi
Gå til: navigasjon, søk
F#
Paradigme Hybrid (Funksjonelt, Objektorientert)
Kom til 2002
Utviklet av Microsoft
Operativsystem Windows (CLR, Linux, Mac OS X (Mono)
Innflytelse av OCaml, ML, C Sharp, Haskell
Filendelser .fs, .fx
Lisens Apache-lisensen
Nettside Microsoft Research

F# (uttalt som F Sharp, etter F dur-skalaen) 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. Syntaksemessig så er F# stort sett kompatibelt med OCaml, et språk i ML-familien.

I likhet med flere språk utviklet av Microsoft så 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 | rediger kilde]

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 Microsoft sin investering i F# var for å 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 bidragsyterene til programmeringsspråket Haskell og kollega av Don Syme, var en nøkkelperson i utviklingen av asynkrone arbeidsforløp i F#.

Syntakse[rediger | rediger kilde]

Syntaksemessig så tar F# veldig mye fra OCaml og flere av språkutviklerene for OCaml ble brukt som ressurser under utviklingen av F#. Når det er sagt så låner F# også idèer fra flere andre funksjonelle språk, som Haskell, men også 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. Med dette kan man tidlig oppdage feil som man ellers ikke ville funnet ut før etter kompilering.

I F# så er variabler uforanderlig. Hvis utvikleren ønsker det kan dette omgås ved å bruke mutable nøkkelordet.

Hello World[rediger | rediger kilde]

En liten sammenligning på et Hello World program i F# og 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 | rediger kilde]

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 | rediger kilde]

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 så vil første eksempel i koden nedenfor feile fordi når det blir kjørt vil den først evaluere createDir som oppretter mappen "Mappenavn", deretter vil den igjen prøve å skape den samme mappen når if-løkken er vellykket. I andre eksempelet så blir kun funksjonen evaluert, og mappen opprettet, når if-løkken er vellykket.

(** 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 opprette"

Referanser[rediger | rediger kilde]

Lenker[rediger | rediger kilde]