A legtöbb F#-ról szóló leírásban az F# fejlesztői a következőképpen definiálják a nyelvet:
"Az F# egy olyan több irányelvet támogató .NET alapú funkcionális nyelv, amely tökéletesen illeszkedik a .NET környezetbe."
Úgy is fogalmazhatunk, hogy az F# szintaxisa hasonlít az ML és az OCaml nyelvekéhez, de az F# kifejezetten a .NET keretrendszert célozza meg. Ez azt jelenti, hogy az F#-ban írt programok probléma nélkül képesek együttműködni más .NET-es komponensekkel.
Az F# készítői igyekeztek úgy kialakítani a nyelvet, hogy a különböző paradigmák jó tulajdonságait minél jobban magában hordozza.
Az első irányelv a funkcionális programozás, mely igen hosszú múltra nyúlik vissza, és egyre fontosabbá válik annak a jó tulajdonságának köszönhetően, hogy az ilyen nyelveken írt programokat könnyebb tesztelni, párhuzamosítani, és bővíteni, mint azokat, melyek objektumorientált szemléletmódban készültek. Legalábbis a gyakorlat ezt látszik bizonyítani.
A másik irányelv az objektumorientált programozás, mely lehetővé teszi, hogy az F# együtt működjön más .NET-es nyelvekkel. Általában akkor használják ki ezt az irányelvet az F# programozók, mikor egyszerű adattípusokat kell megvalósítani, egy feladat megoldásához szükséges műveleteket csoportosítani kell, vagy éppen egy objektumorientált interfésszel rendelkező keretrendszerrel kell együttműködnie a programnak.
Ezen felül a harmadik irányelv, amit az F# támogat, az a nyelv orientált programozás. Általában a nyelv orientált programozási nyelvek segítségével valamilyen jól struktúrált kódhoz készítenek futtatókörnyezeteket (pl.: XML).
Az F# implementálja a Caml programozási nyelv magját, valamint ezt kiegészítí a .NET Framework lehetőségeivel, továbbá a nyelvek egymásba ágyazásának lehetőségével. A cél az, hogy egyszerre dolgozhassunk C#-al, Visual Basic-el, SML.NET-el és más .NET programozási nyelvvel. Lényegében ez az első ML nyelv, ahol minden típus és érték használható valamely más, jelentős programozási nyelvből (pl.: C#) egyszerű, barátságos módon.
A tiszta funkcionális nyelvek (pl.: Haskell) kitűnőek jó néhány feladatra, de akadnak olyan egyszerű programozói feladatok, melyeket nagyon nehezen lehet segítségükkel megoldani. A tiszta imperatív nyelvek (pl.: C vagy Pascal) nem nyújtanak kielégítő mechanizmusokat az absztrakcióra és adatmanipulációra. A tiszta objektumorientált nyelvek (pl.: Smalltalk) kitűnőek dinamikus programok készítésére. Típusos, osztály-alapú nyelvek (pl.: C# és Java) nagyon sok fajta konstrukciót tartalmaznak, amelyek közti választás néha nagyon megnehezíti a programozó dolgát, nehezen tud dönteni, hogy miként modellezze a valóságot, és egyszerű feladatok megoldására bonyolult kód születik. Ezzel ellentétben néhány nyelv (pl.: Caml) kis számú ortogonális konstrukciót biztosít, amellyel gyorsan dolgozhatunk, és ezáltal hatékony kódot készíthetünk.
Az F# támogat jó néhány OCaml könyvtárat is, tehát nem kötelező a .NET könyvtárak használata. Az is lehetséges, hogy nagy alkalmazásokat készítsünk, és OCaml bytecode-ra fordítsuk az ereményt, vagy éppen .NET code-ra.