Jednotek (F#)
Plovoucí bod a hodnoty se znaménkem v F# jsou přidruženy měrných jednotkách, které se obvykle používají k označení délka, objem, hmotnost, atd.Pomocí množství jednotek, povolte kompilátoru ověřte, zda aritmetické vztahy správné jednotky, která pomáhá zabránit chyby v programování.
[<Measure>] type unit-name [ = measure ]
Poznámky
Definuje předchozí syntaxe unit-name jako měrnou jednotku.Volitelná součást slouží k definování nových opatření v dříve určené jednotky.Například následující řádek definuje opatření cm (centimetry).
[<Measure>] type cm
Následující řádek definuje opatření ml (milliliter) jako centimetry krychlové (cm^3).
[<Measure>] type ml = cm^3
V syntaxi předchozí measure je vzorec, který zahrnuje jednotek.Ve vzorcích, které se týkají jednotek, nedílnou pravomocí podporovaných (kladné a záporné), mezery mezi jednotkami označení výrobku dvou jednotek * také označuje produkt jednotek, a / označuje podíl jednotek.Pro vzájemné jednotku můžete použít buď napájení záporné celé číslo nebo / označuje oddělení čitatel a jmenovatel jednotky vzorce.Závorky by měly být uvedeny ve jmenovateli uvedeno více jednotek.Jednotky oddělené mezerami po / jsou interpretovány jako součást jmenovatel, ale všech jednotek * jsou interpretovány jako součást čítači.
1 Můžete použít ve výrazech jednotky, buď samostatně uvést bezrozměrný množství nebo spolu s jiných jednotek, například jako v čitateli.Jednotky pro sazby by například zapsat jako 1/s, kde s označuje sekund.Závorky se nepoužívají ve vzorcích jednotky.Nezadáte převodu číselných konstant ve vzorcích jednotky; Můžete však samostatně definovat konstanty převod s jednotkami a jejich použití v kontrole jednotky výpočty.
Jednotky vzorce, které mají stejný význam lze zapsat různými způsoby rovnocenné.Kompilátor proto převádí jednotky vzorce jednotný formulář, který převede negativní pravomocí recipročních, skupiny jednotek do jediného čitatel a jmenovatel a seřadí podle abecedy jednotek v čitateli a jmenovateli.
Například jednotka vzorce kg m s^-2 a m /s s * kg i převedeny na kg m/s^2.
Používáte ve výrazech plovoucí bod měrné jednotky.Pomocí čísla s plovoucí desetinnou spolu s přidruženou jednotek měření zvyšuje úroveň zabezpečení typů a pomáhá zabránit chybám neshoda jednotky, které mohou nastat ve vzorcích při použití slabě zadaného čísla s plovoucí desetinnou.Pokud píšete plovoucí bod výraz, který používá jednotky, jednotky ve výrazu musí odpovídat.
Literály se jednotky vzorce v lomených závorkách můžete opatřit poznámkami, jak je uvedeno v následujících příkladech.
1.0<cm>
55.0<miles/hour>
Nevkládejte mezeru mezi číslo a úhlová závorka; však mohou obsahovat příponu literál jako f, jako v následujícím příkladu.
// The f indicates single-precision floating point.
55.0f<miles/hour>
Tyto poznámky změní typ literál z jeho primitivní typ (například float) kótované typu, například float<cm> nebo v případě float<miles/hour>.Jednotka poznámku o <1> označuje bezrozměrný množství a jeho typ je ekvivalentní primitivní typ bez parametru jednotky.
Typ měrná jednotka je plovoucí bod nebo podepsané integrálního typu spolu s další jednotky poznámky uvedené v závorkách.Proto při psaní typ převodu z g (v gramech) na kg (kg), popisují typy takto.
let convertg2kg (x : float<g>) = x / 1000.0<g/kg>
Měrné jednotky jsou používány pro kompilaci přezkoušením ale nepřetrvají prostředí run-time.Proto neovlivní výkon.
Měrné jednotky lze použít libovolný typ, nejen plovoucí typy; však pouze plovoucí bod typy podepsané nedílnou typů a množství podpora dimenzovány desítkové typy.Proto jej pouze smysl pomocí měrné jednotky na primitivní typy a agregáty, které obsahují tyto primitivní typy.
Následující příklad ukazuje použití měrné jednotky.
// Mass, grams.
[<Measure>] type g
// Mass, kilograms.
[<Measure>] type kg
// Weight, pounds.
[<Measure>] type lb
// Distance, meters.
[<Measure>] type m
// Distance, cm
[<Measure>] type cm
// Distance, inches.
[<Measure>] type inch
// Distance, feet
[<Measure>] type ft
// Time, seconds.
[<Measure>] type s
// Force, Newtons.
[<Measure>] type N = kg m / s
// Pressure, bar.
[<Measure>] type bar
// Pressure, Pascals
[<Measure>] type Pa = N / m^2
// Volume, milliliters.
[<Measure>] type ml
// Volume, liters.
[<Measure>] type L
// Define conversion constants.
let gramsPerKilogram : float<g kg^-1> = 1000.0<g/kg>
let cmPerMeter : float<cm/m> = 100.0<cm/m>
let cmPerInch : float<cm/inch> = 2.54<cm/inch>
let mlPerCubicCentimeter : float<ml/cm^3> = 1.0<ml/cm^3>
let mlPerLiter : float<ml/L> = 1000.0<ml/L>
// Define conversion functions.
let convertGramsToKilograms (x : float<g>) = x / gramsPerKilogram
let convertCentimetersToInches (x : float<cm>) = x / cmPerInch
Následující příklad kódu ukazuje, jak převést na kótované pohyblivé bod bezrozměrný plovoucí číslo bodu.Jste právě vynásobte 1.0, použití dimenzí 1.0.Je to abstraktní do funkce jako degreesFahrenheit.
Také při předání kótované hodnot na funkce, které očekáváte bezrozměrný plovoucí desetinnou čárkou, musíte zrušit mimo jednotek nebo přetypovat na float pomocí float operátor.V tomto příkladu rozdělit podle 1.0<degC> pro argumenty k printf protože printf očekává bezrozměrný množství.
[<Measure>] type degC // temperature, Celsius/Centigrade
[<Measure>] type degF // temperature, Fahrenheit
let convertCtoF ( temp : float<degC> ) = 9.0<degF> / 5.0<degC> * temp + 32.0<degF>
let convertFtoC ( temp: float<degF> ) = 5.0<degC> / 9.0<degF> * ( temp - 32.0<degF>)
// Define conversion functions from dimensionless floating point values.
let degreesFahrenheit temp = temp * 1.0<degF>
let degreesCelsius temp = temp * 1.0<degC>
printfn "Enter a temperature in degrees Fahrenheit."
let input = System.Console.ReadLine()
let mutable floatValue = 0.
if System.Double.TryParse(input, &floatValue)
then
printfn "That temperature in Celsius is %8.2f degrees C." ((convertFtoC (degreesFahrenheit floatValue))/(1.0<degC>))
else
printfn "Error parsing input."
Následující příklad relaci zobrazuje z výstupů a vstupů do tohoto kódu.
Enter a temperature in degrees Fahrenheit.
90
That temperature in degrees Celsius is 32.22.
Pomocí obecného jednotek
Data související měrné můžete psát Obecné funkce, které pracují.Provedete to zadáním typu spolu s obecnou jednotku jako parametr typu, jak je znázorněno v následujícím příkladu kódu.
// Distance, meters.
[<Measure>] type m
// Time, seconds.
[<Measure>] type s
let genericSumUnits ( x : float<'u>) (y: float<'u>) = x + y
let v1 = 3.1<m/s>
let v2 = 2.7<m/s>
let x1 = 1.2<m>
let t1 = 1.0<s>
// OK: a function that has unit consistency checking.
let result1 = genericSumUnits v1 v2
// Error reported: mismatched units.
// Uncomment to see error.
// let result2 = genericSumUnits v1 x1
Vytvoření agregační typy s Obecné jednotky
Následující kód ukazuje, jak vytvořit agregační typ, který se skládá z jednotlivých hodnot s plovoucí čárkou, které mají jednotky, které jsou obecné.Díky jeden typ vytvořit, který pracuje s různými jednotkami.Obecné jednotky také zachovat bezpečnost typů zajišťující, že obecný typ, který má jednu sadu jednotek je jiného typu než stejný obecný typ s jinou sadou jednotek.Na základě tohoto postupu je, že Measure atribut lze použít pro parametr typu.
// Distance, meters.
[<Measure>] type m
// Time, seconds.
[<Measure>] type s
// Define a vector together with a measure type parameter.
// Note the attribute applied to the type parameter.
type vector3D<[<Measure>] 'u> = { x : float<'u>; y : float<'u>; z : float<'u>}
// Create instances that have two different measures.
// Create a position vector.
let xvec : vector3D<m> = { x = 0.0<m>; y = 0.0<m>; z = 0.0<m> }
// Create a velocity vector.
let v1vec : vector3D<m/s> = { x = 1.0<m/s>; y = -1.0<m/s>; z = 0.0<m/s> }
Jednotky za běhu
Měrné jednotky se používají pro kontrolu statického typu.Při kompilovaných hodnoty s plovoucí čárkou, jsou odstraněny měrné jednotky, jednotky jsou ztraceny při běhu.Proto není možné pokus o implementaci funkcí, která závisí na kontrole jednotky v době spuštění.Například provádění ToString funkce vytisknout jednotky není možná.
Převody
Převést typ, který má jednotky (například float<'u>) na typ, který nemá jednotky, můžete použít funkci standardního převodu.Můžete například použít float převést na float hodnotu, která nemá jednotky, jak je znázorněno v následujícím kódu.
[<Measure>]
type cm
let length = 12.0<cm>
let x = float length
Chcete-li převést hodnotu unitless na hodnotu, která má jednotky, můžete vynásobte hodnotu 1 nebo 1.0, která je označena v odpovídajících jednotkách.Pro psaní interoperability vrstev, existují však také některé explicitní funkce, které lze použít k převodu hodnoty unitless na hodnoty s jednotkami.Jsou v Microsoft.FSharp.Core.LanguagePrimitives modulu.Například převést unitless float se float<cm>, použít FloatWithMeasure, jak je znázorněno v následujícím kódu.
open Microsoft.FSharp.Core
let height:float<cm> = LanguagePrimitives.FloatWithMeasure x
F# Power Pack měrné jednotky
Jednotka knihovny je k dispozici v PowerPack F#.Jednotka knihovny obsahuje jednotek SI a fyzikální konstanty.