b'\n_START_ARTICLE_\nF Sharp\n_START_SECTION_\nHistorie\n_START_PARAGRAPH_\nDon Syme i Microsoft Research brukte 5 \xc3\xa5r p\xc3\xa5 \xc3\xa5 utforske muligheten til \xc3\xa5 implementere et funksjonelt programmeringsspr\xc3\xa5k som siktet seg inn p\xc3\xa5 .NET-rammeverket. En av hovedgrunnene til Microsofts investering i F# var \xc3\xa5 n\xc3\xa5 inn i nye domener som deres tidligere spr\xc3\xa5k ikke har v\xc3\xa6rt innblandet i, blant annet vitenskapelige og matematiske omr\xc3\xa5der. Simon Peyton Jones, en av de st\xc3\xb8rste bidragsyterne til programmeringsspr\xc3\xa5ket Haskell og kollega av Don Syme, var en n\xc3\xb8kkelperson i utviklingen av asynkrone arbeidsforl\xc3\xb8p i F#.\n_START_SECTION_\nSyntaks\n_START_PARAGRAPH_\nSyntaksmessig tar F# veldig mye fra OCaml, og flere av spr\xc3\xa5kutviklerne for OCaml ble brukt som ressurser i utviklingen av F#. F# l\xc3\xa5ner ogs\xc3\xa5 ideer fra flere andre funksjonelle spr\xc3\xa5k, som Haskell, men ogs\xc3\xa5 fra imperative og objektorienterte spr\xc3\xa5k som C# og Python._NEWLINE_F# tar i bruk sterk typesetting og implisitt typededuksjon. Som resultat kan man velge hvorvidt man \xc3\xb8nsker \xc3\xa5 spesifikt definere type, eller om kompilatoren skal unders\xc3\xb8ke det selv. I enkelte tilfeller kan det v\xc3\xa6re en fordel \xc3\xa5 spesifisere hvilke type man \xc3\xb8nsker \xc3\xa5 bruke for \xc3\xa5 v\xc3\xa6re sikker p\xc3\xa5 at inndata kommer i den typen man \xc3\xb8nsker, og utdata blir levert av samme grunn. Dermed kan man tidlig oppdage feil som man ellers ikke ville funnet f\xc3\xb8r etter kompilering._NEWLINE_I F# er alle variabler i utgangspunktet uforanderlige. Hvis utvikleren \xc3\xb8nsker det, kan dette omg\xc3\xa5s ved \xc3\xa5 bruke mutable n\xc3\xb8kkelordet.\n_START_SECTION_\nHello World\n_START_PARAGRAPH_\nEn liten sammenligning av et Hello World-program i F# og et tilsvarende i OCaml, med kommentarer og variabeldeklarasjon:_NEWLINE_(* Dette er en kommentar og eksempel i F# *)let variabel = "Hello World"printfn "%s" variabel_NEWLINE_(* Dette er en kommentar og eksempel i OCaml*)let variabel = "Hello world"print_string variabel\n_START_SECTION_\nCurrying\n_START_PARAGRAPH_\nB\xc3\xa5de variabler og funksjoner er verdier i F#. Dette gj\xc3\xb8r at man kan bruke ufullstendige funksjoner og currying p\xc3\xa5 funksjoner. Et lite eksempel p\xc3\xa5 currying i F#:_NEWLINE_open System.Windows.Formslet msgbox tittel innhold = MessageBox.Show(innhold, tittel)let delvisMsgBox = msgbox "Dette er tittelen"delvisMsgBox "Dette er innholdet"\n_START_SECTION_\nLat evaluering\n_START_PARAGRAPH_\nSom standard blir F# lest og evaluert fra topp til bunn, men ved \xc3\xa5 bruke lazy-n\xc3\xb8kkelordet kan man bruke lat evaluering, slik at koden ikke blir evaluert f\xc3\xb8r man absolutt vil det. Et eksempel p\xc3\xa5 nytten av lat evaluering kan v\xc3\xa6re hvis man \xc3\xb8nsker \xc3\xa5 kalkulere store tall som man ikke vil bruke tid og prosessorkraft p\xc3\xa5 f\xc3\xb8r det faktisk trengs._NEWLINE_Siden F# blir lest fra topp til bunn, vil f\xc3\xb8rste eksempel i koden nedenfor feile. fordi F\xc3\xb8rst evalueres createDir, som oppretter mappen "Mappenavn", deretter vil den igjen pr\xc3\xb8ve \xc3\xa5 skape den samme mappen n\xc3\xa5r if-uttrykket blir evaluert som sant. I det neste eksemplet blir ikke funksjonen createDir evaluert og mappen opprettet f\xc3\xb8r if-uttrykket blir evaluert som sant i den tredje kodelinjen._NEWLINE_(** Med ivrig evaluering **)let skalOpprette = truelet createDir = Directory.CreateDirectory(@"C:\\Mappenavn")if skalOpprette then createDir else failwith "Ikke opprettet"_NEWLINE_(** Med lat evaluering **)let skalOpprette = truelet createDir = lazy( Directory.CreateDirectory(@"C:\\Mappenavn") )if skalOpprette then createDir.Force() else failwith "Ikke opprettet"'