Denne artikkelen omhandler programmeringsspråket.  For tonen «fiss» (F♯), se tone.

**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. 

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
--------

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
-------

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

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

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

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
---------------

* Offisielt nettsted Rediger på Wikidata

* (en) F Sharp (programming language) – kategori av bilder, video eller lyd på Commons Rediger på Wikidata
* Microsoft Research's nettside for F#
* Microsoft F# Developer Center
* Don Syme's blog, en nøkkelkilde for F#
* Planet F# Arkivert 13. februar 2009 hos Wayback Machine.
* The F# Survival Guide, Dec 2009 (Nettbasert bok)
* The F# 2.0 Spesifikasjon
* Intervju med Don Syme

| * v
* d
* r
Programmeringsspråk |
| --- |
| Tidslinje |
| A# **·** ActionScript **·** Ada **·** Alef **·** ALGOL **·** ALGOL 58 **·** ALGOL 60 **·** ALGOL 68 **·** ALTRAN **·** APL **·** AppleScript **·** Argus **·** Assembler **·** Autokode **·** awk **·** B **·** BASIC **·** BCPL **·** BETA **·** BitC **·** BLISS **·** Bourne Shell **·** C **·** C++ **·** C-- **·** CHILL **·** C# **·** C shell **·** Caml **·** Ch **·** Cilk **·** Cilk++ **·** Cilk Plus **·** Clarion **·** Clipper **·** CLISP **·** Clojure **·** CLU **·** COBOL **·** COMAL **·** Common Lisp **·** Concurrent C **·** Concurrent Euclid **·** Concurrent Pascal **·** C shell **·** D **·** Delphi **·** Dylan **·** ECMAScript **·** Eiffel **·** Emacs Lisp **·** Erlang **·** Euclid **·** F\* **·** F# **·** Forth **·** Fortran **·** GNU Common Lisp **·** GNU Pascal **·** Go **·** Haskell **·** HyperTalk **·** Incr Tcl **·** INTERCAL **·** Interlisp **·** Java **·** JavaScript **·** JRuby **·** LaTeX **·** Legoscript **·** LilyPond **·** Limbo **·** Lisp **·** LPC **·** Lua **·** Lynx **·** Mary **·** MATLAB **·** Mesa **·** ML **·** MML **·** Modula **·** Modula-2 **·** MUMPS **·** Objective-C **·** Objective-C++ **·** OCaml **·** OpenVera **·** O'Haskell **·** Pascal **·** Perl **·** PHP **·** Pike **·** PL/I **·** Plankalkül **·** PLEX **·** Prolog **·** Protel **·** Pure Data **·** Python **·** R **·** Ratfor **·** REXX **·** RTL/2 **·** Ruby **·** Rust **·** SAS **·** Scala **·** Scheme **·** Scratch **·** Simula **·** SML **·** Smalltalk **·** SNOBOL **·** Tcsh **·** Tcl **·** TECO **·** TOM **·** Turbo Basic **·** Turbo Pascal **·** Verilog **·** Visual Prolog **·** Turing **·** TypeScript **·** Vala **·** VHDL **·** Visual Basic **·** Flere.. |
| 
* Kategori **Kategori**

 |