Aracılığıyla paylaş


Ölçü birimi (F#)

Nokta ve imzalı tamsayı değerler F# Yüzen toplu vb. uzunluğu, birim, göstermek için genellikle kullanılan ölçü birimlerini ilişkili. Miktarları ile birimleri kullanarak önlemeye yardımcı olur aritmetik ilişkileri doğru birim yüklü olduğunu doğrulamak derleyici etkinleştirme hataları programlama.

[<Measure>] type unit-name [ = measure ]

Notlar

Önceki sözdizimi tanımlar unit-name gibi bir ölçü birimi. İsteğe bağlı bölümü önceden tanımlanmış birimleri açısından yeni bir ölçü birimi tanımlamak için kullanılır. Örneğin, aşağıdaki satırı ölçü tanımlar cm (santimetre).

[<Measure>] type cm

Ölçü birimi aşağıdaki satırı tanımlayan ml (milliliter) olarak santimetre küp (cm^3).

[<Measure>] type ml = cm^3

Önceki sözdiziminde, measure birimlerini kapsayan bir formüldür. Birimleri içeren formüller (pozitif ve negatif) ayrılmaz kuvvetlere desteklenir, ürün iki birim birimler arasında boşluk belirtmek * de bir ürün, birim gösterir ve / bir bölüm birimi gösterir. Karşılıklı bir birim için bir negatif tamsayı güç ya da kullanabilir ya da bir / , Pay ve Payda birimi formülün arasında bir ayrım gösterir. Birden çok birim payda parantezlerle alýnmalýdýr. Sonra boşluk birimlerine ayrılmış bir / payda ancak izleyen tüm birimleri bir parçası olacak şekilde yorumlanan bir * pay bir parçası olacak şekilde yorumlanır.

1 Birim ifadelerde, ya da tek başına dimensionless bir miktar belirtmek veya diğer birimleri, pay gibi birlikte kullanabilirsiniz. Örneğin, bir fiyatı birimleri gibi yazılan 1/s, s saniye gösterir. Birim formüllerde ayraç kullanılmaz. Birim formüllerde sabitleri sayısal dönüştürme belirtmeyin; Ancak, dönüştürme sabitleri birimleri ile ayrı ayrı tanımlamak ve bunları birimine teslim hesaplamalarda kullanabilirsiniz.

Aynı anlamda birimi formülleri eşdeğer çeşitli şekillerde yazılabilir. Bu nedenle, derleyici birimi formülleri tek bir pay ve Payda bir negatif kuvvetlere devrik değeridir, gruplar birimlerini dönüştürür ve birim pay ve Payda alfabetik olarak sıralar tutarlı biçimdeki dönüştürür.

Örneğin, birim formüller kg m s^-2 ve m /s s * kg her ikisi de dönüştürülür kg m/s^2.

Kayan nokta ifadelerinde, ölçü birimleri kullanın. Kayan noktalı sayılar ilişkili birimleri ile birlikte ölçü kullanarak başka bir tür güvenliği düzeyini ekler ve yardımcı formüllerde zayıf yazılı kayan noktalı sayılar kullandığınızda oluşabilecek birimi uyumsuzluğu hatalarını önlemek. Kayan yazarsanız birimleri kullanan noktasını ifade ifade birimlerle aynı olmalıdır.

Aşağıdaki örneklerde gösterildiği gibi köşeli parantez birimini formülde taşıyan yorumlarını yazabilirler.

1.0<cm>
55.0<miles/hour>

Numara ve açılı ayraç arasına boşluk koymayın; Ancak, değişmez bir sonek gibi ekleyebilirsiniz f, aşağıdaki örnekteki gibi.

// The f indicates single-precision floating point.
55.0f<miles/hour> 

Böyle bir açıklama, ilkel türünden hazır bilgi türünü değiştirir (gibi float) dimensioned türü gibi float<cm> veya böyle bir durumda, float<miles/hour>. Bir birimi ek açıklama, <1> dimensionless miktarı ve türü bir birim parametre olmadan basit tür eşdeğer olduğunu gösterir.

Kayan nokta veya imzalı tamsayı türü ile birlikte ek birim ölçümde parantez içinde gösterilen ölçü birimi türü. Bu nedenle, ne zaman yazdığınız dönüştürme türünü g (gram) için kg (kilogram) aşağıdaki gibi türleri açıklanmaktadır.

let convertg2kg (x : float<g>) = x / 1000.0<g/kg>

Ölçü birimi denetlemesini derleme zamanı birimi için kullanılır, ancak çalışma ortamında kalıcı olmaz. Bu nedenle, bunlar performansını etkilemez.

Ölçü değil noktası türleri Yüzen herhangi bir türü için uygulanabilir; Ancak, kayan nokta türleri yalnızca, imzalı ayrılmaz türleri ve ondalık türlerini dimensioned destek miktarları. Bu nedenle, yalnızca bu ilkel türleri içeren toplamları ve İlkel türler üzerinde ölçü birimlerini kullanan anlamlıdır.

Aşağıdaki örnek, ölçü birimi kullanımını göstermektedir.

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

Aşağıdaki kod örneği, dimensionless kayan nokta sayısı dimensioned bir kayan nokta değeri dönüştürmek verilmektedir. 1.0 Tarafından yalnızca boyutları 1.0 uygulama çarpın. Bu gibi bir işlevi içine soyut degreesFahrenheit.

Ayrıca, dimensionless kayan noktalı sayılar beklediğiniz işlevlere dimensioned değerleri geçirdiğinizde, birimleri iptal etmeli veya için artığını float kullanarak float işleci. Bu örnekte, tarafından bölmek 1.0<degC> için bağımsız değişkenler için printf çünkü printf dimensionless miktarları bekler.

[<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."

Aşağıdaki örnek oturum bu kod girişleri ve çıkışları gösterir.

Enter a temperature in degrees Fahrenheit.
90
That temperature in degrees Celsius is    32.22.

Genel birimlerini kullanma

İlişkili ölçü olan veri üzerinde çalışmaya genel işlevleri yazabilirsiniz. Bunu bir tür parametresi bir tür genel birim ile birlikte belirterek aşağıdaki kod örneğinde gösterildiği gibi yapabilirsiniz.

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

Toplam türleri ile genel birim oluşturma

Aşağıdaki kod, genel birimi olan tek kayar nokta değerleri oluşan bir toplama türü oluşturulması gösterilmiştir. Bu, çeşitli birimleri ile çalışan oluşturulacak bir tek türü sağlar. Ayrıca, genel birim, tek bir birim kümesi olan bir genel tür farklı bir birim kümesi ile aynı genel türü dışında farklı bir tür olduğunu doğrulayarak tür güvenliği korumak. Bu tekniğin temeli olan Measure öznitelik türü parametresi uygulanabilir.

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

Zamanında birimleri

Ölçü, statik tür denetlemesi için kullanılır. Kayan noktalı değerlere derlendiğinde birimleri çalışma zamanında kaybolur için ölçü birimlerini ortadan kalkar. Bu nedenle, çalışma zamanında birimleri denetimini bağlıdır işlevselliğini uygulamak için herhangi bir girişim mümkün değildir. Örneğin, uygulama bir ToString birimleri yazdırmak için fonksiyon mümkün değil.

Dönüşümleri

Birimleri olan bir türü dönüştürmek için (örneğin, float<'u>) birimleri yok türü için standart dönüştürme işlevini kullanabilirsiniz. Örneğin, kullanabileceğiniz float dönüştürmek için bir float birimleri, aşağıdaki kodda gösterildiği gibi olmayan değer.

[<Measure>]
type cm
let length = 12.0<cm>
let x = float length

Unitless değeri bulunan bir değere dönüştürmek için açıklama eklenir 1.0 ya da 1 değeri tarafından uygun birimi ile çarpabilirsiniz. Ancak, birlikte çalışabilirlik katmanları yazmak için de vardır, unitless değerleri ile birim değerlere dönüştürmek için kullanabileceğiniz bazı açık işlevleri. Bunların içinde olduğunu Microsoft.FSharp.Core.LanguagePrimitives modülü. Örneğin, unitless bir dönüştürmek için float için bir float<cm>, kullanma FloatWithMeasure, aşağıdaki kodda gösterildiği gibi.

open Microsoft.FSharp.Core
let height:float<cm> = LanguagePrimitives.FloatWithMeasure x

F# Power Pack ölçü birimleri

Birim kitaplık F# PowerPack içinde kullanılabilir. Birim kitaplık sı birimleri ve fiziksel sabitler içerir.

Ayrıca bkz.

Diğer Kaynaklar

F# dil başvurusu