Referanseløs: Denne artikkelen inneholder enliste over kilder, litteratur ellereksterne lenker, men enkeltopplysninger lar seg ikkeverifisere fordi det mangler konkrete kildehenvisninger i form av fotnotebasertereferanser. Du kan hjelpe til med å sjekke opplysningene mot kildemateriale og legge inn referanser. Opplysninger uten kildehenvisning i form av referanser kan bli fjernet. |
| F Sharp | |||
|---|---|---|---|
| Tilblivelse | 2005 | ||
| Paradigme | 6 paradigmer Multi-paradigme:Funksjonell programmering,imperativ programmering,objektorientert programmering,metaprogrammering, selvmodifiserende programmering,samtidig programmering | ||
| Designet av | Don Syme,Microsoft Research | ||
| Utviklet av | Microsoft,F Sharp Software Foundation | ||
| Siste versjon(er) | 10.0 / 11. nov. 2025 | ||
| Typetildeling | statisk, sterk, inferens | ||
| Filendelse(r) | .fs, .fsi, .fsx, .fsscript | ||
| OS | multiplattform | ||
| Lisens | Apache-lisensen | ||
| Påvirket av | |||
| MetaLanguage,Objective Caml,C#,Erlang,Haskell,Python,Scala | |||
F# (uttalt somF Sharp) er et funksjonelt programmeringsspråk utviklet avMicrosoft medDon 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 ogobjektorientert programmering. Syntaksmessig er F# stort sett kompatibelt medOCaml, et språk iML-familien.
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# ogVisual Basic.
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åketHaskell og kollega av Don Syme, var en nøkkelperson i utviklingen av asynkrone arbeidsforløp i F#.
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 somC# ogPython.
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 å brukemutable nøkkelordet.
En liten sammenligning av etHello World-program i F# og et tilsvarende i OCaml, med kommentarer og variabeldeklarasjon:
(* Dette er en kommentar og eksempel i F# *)letvariabel="Hello World"printfn"%s"variabel
(* Dette er en kommentar og eksempel i OCaml*)letvariabel="Hello world"print_stringvariabel
Både variabler og funksjoner er verdier i F#. Dette gjør at man kan bruke ufullstendige funksjoner ogcurrying på funksjoner. Et lite eksempel på currying i F#:
openSystem.Windows.Formsletmsgboxtittelinnhold=MessageBox.Show(innhold,tittel)letdelvisMsgBox=msgbox"Dette er tittelen"delvisMsgBox"Dette er innholdet"
Som standard blir F# lest og evaluert fra topp til bunn, men ved å brukelazy-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 evaluerescreateDir, 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 funksjonencreateDir evaluert og mappen opprettet før if-uttrykket blir evaluert som sant i den tredje kodelinjen.
(** Med ivrig evaluering **)letskalOpprette=trueletcreateDir=Directory.CreateDirectory(@"C:\Mappenavn")ifskalOpprettethencreateDirelsefailwith"Ikke opprettet"
(** Med lat evaluering **)letskalOpprette=trueletcreateDir=lazy(Directory.CreateDirectory(@"C:\Mappenavn"))ifskalOpprettethencreateDir.Force()elsefailwith"Ikke opprettet"