وحدات المقياس (F#)

اليؤشر العائمة و يمكن أن تحتوي قيم عدد صحيح ذو إشارة في F# المقترنة وحدات القياس، التي عادة ما تستخدم للإشارة إلى الطول ووحدة التخزين كبير السعة، و هكذا. تمكين المحول البرمجي باستخدام كميات وحدات، إلى التحقق من أن علاقات الحسابية وحدات الصحيحة، مما يساعد على منع الأخطاء في البرمجة.

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

ملاحظات

بتعريف بناء الجملة السابقة unit-nameكـ وحدة meكـure. جزء اختياري هو المستخدمة لتعريف مقياس جديد من وحدات المعرفة مسبقاً. ل مثال، ويعرف السطر التالي المقياس cm(سنتيمتر).

[<Measure>] type cm

ويعرف السطر التالي meكـure ml(milliliter) كـ سنتيمتر مكعبة ( cm^3).

[<Measure>] type ml = cm^3

في بناء الجملة السابق، measureهي صيغة التي تتضمن وحدات. في الصيغ التي تتضمن وحدات، يتم دعم قوي المتكاملة (موجب وسالب)، مسافات بين وحدات الإشارة إلى منتج من الوحدات الثاني *يشير أيضا إلى منتج وحدات، و /يشير إلى حاصل الوحدات. لوحدة متبادلة، يمكنك أما استخدم إس عدد صحيح سالب أو /التي تشير إلى فصل بين البسط والمقام من صيغة الوحدة. يجب أن تكون وحدات متعددة المستخدم في مقام محاطة بواسطة الأقواس. وحدات مفصولة بمسافات بعد /تفسير كـ الآن جزءا من المقام، ولكن أي وحدات اتباع *تفسير كـ الآن جزءا من بسط.

يمكنك استخدام 1 في تعبيرات وحدة، أما مفرداً للإشارة إلى كمية dimensionless، أو مع وحدات غير ذلك، مثل كـ في بسط. على سبيل المثال، قد تتم كتابة وحدات لنسبة ك 1/s، الموقع sيشير إلى الثواني. لا تستخدم الأقواس في الصيغ الوحدة. لم تحدد تحويل الرقمية الثوابت في الصيغ وحدة؛ ومع ذلك، يمكنك تعريف الثوابت تحويل بشكل منفصل و استخدم في حسابات محدد من الوحدة.

يمكن كتابة صيغ الوحدة تعني نفس الشيء بعدة طرق مكافئة. ولهذا المحول البرمجي بتحويل الصيغ الوحدة في إلى نموذج متناسقة، والذي يحول قوي سالبة إلى لمقلوب الأرقام، وحدات المجموعات في إلى numeraإلىr مفرد denominaإلىr، ويفرز وحدات numeraإلىr و denominaإلىr.

ل مثال، وحدة الصيغ kg m s^-2و m /s s * kgيتم محول كل منهما إلى kg m/s^2.

استخدام وحدات القياس في فاصلة عائمة التعبيرات. استخدام فاصلة عائمة الأرقام مع المقترنة وحدات الالمقياس بإضافة المستوى آخر من نوع أمان ويساعدك على تجنب أخطاء عدم تطابق الوحدة التي يمكن أن تحدث في الصيغ عند استخدام مكتوب weakly فاصلة عائمة أرقام. إذا قمت بكتابة فاصلة عائمة التعبير الذي يستخدم وحدات، يجب أن تتطابق الوحدات في التعبير.

يمكنك إضافة تعليقات إلى القيم الحرفية بصيغة وحدة في أقواس زاوية، كـ هو مبين في الأمثلة التالية.

1.0<cm>
55.0<miles/hour>

لا تضع مسافة بين الرقم وقوس الزاوية؛ ومع ذلك، يمكنك تضمين لاحقة قيمة حرفية مثل كـ f، كـ في المثال التالي.

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

تعليق توضيحي بتغيير نوع الحرفي من نوعه الأولية (مثل float) إلى dimensioned نوع، مثل float<cm>أو، في هذه الحالة، float<miles/hour>. تعليق توضيحي وحدة من <1>يدل كمية dimensionless، ونوعه هو مكافئ لنوع الأولية بدون معلمة الوحدة.

نوع وحدة المقياس هو اليؤشر العائمة أو موقعة نوع المتكاملة مع تعليق توضيحي وحدة إضافية، المشار إليها في أقواس. وهكذا، عندما تقوم بكتابة نوع تحويل من g(عدد) إلى kg(غرام)، التي تصف أنواع كما يلي.

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

وحدات القياس المستخدمة لوحدة وقت التحويل البرمجي يتم الآن التدقيق ولكن يتم لا يستمر في بيئة وقت التشغيل. ولذلك، فإنها لا تؤثر على الأداء.

وحدات القياس يمكن تطبيق أي نوع، وليست فاصلة عائمة يكتب؛ على الرغم من ذلك، فقط فاصلة عائمة تدعم كميات dimensioned أنواع والأنواع المتكاملة الموقعة وأنواع عشري. ولذلك، فمن فقط المفيد إلى استخدام وحدات القياس تشغيل الأنواع الأولية والتجميعات التي تحتوي تشغيل هذه الأنواع الأولية.

يوضح المثال التالي استخدم من وحدات القياس.

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

يوضح المثال تعليمات برمجية التالي كيفية تحويل من dimensionless فاصلة عائمة الرقم إلى dimensioned فاصلة عائمة القيمة. يمكنك فقط ضرب 1.0، تطبيق الأبعاد إلى 1.0. مجردة هذا في دالة مثل degreesFahrenheit.

أيضا، عندما قمت بتمرير قيم dimensioned للوظائف التي تتوقعها dimensionless فاصلة عائمة الأرقام، يجب عليك إلغاء الأمر سحب وحدات أو تحويل إلى floatباستخدام floatعامل التشغيل. في هذا المثال، يمكنك قسمة 1.0<degC>الوسائط إلى printfلأن printfيتوقع كميات dimensionless.

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

يعرض الإخراج من الجلسة المثال التالي ويعد إدخالاً إلى هذه تعليمات برمجية.

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

استخدام وحدات عام

يمكنك كتابة عامة دالات التي تعمل تشغيل بيانات التي تحتوي وحدة المقياس مقترنة. تقوم بذلك بواسطة تحديد نوع مع وحدة عامة كمعلمة نوع، كما هو موضح في التالية تعليمات برمجية المثال.

 // 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/s>
 let t1 = 1.0<s>

 // OK: a function that has unit consistency checking.
 let result1 = genericSumUnits v1 v2
 // Error reported: mismatched units.
 let result2 = genericSumUnits v1 x1

قم بإنشاء أنواع تجميع مع وحدات العامة

التعليمة البرمجية التالية يوضح كيفية إنشاء أحد أنواع تجميعية التي تتألف من الأفراد فاصلة عائمة قيم التي تحتوي على وحدات غير عامة. يمكنك هذا من نوع مفرد إلى تاريخ الإنشاء ذلك يعمل مع العديد من وحدات. وكذلك المحافظة وحدات العامة نوع أمان بواسطة التأكد من نوع عام يحتوي على التعيين واحدة من وحدات هو نوع آخر من نفس النوع العام باستخدام التعيين مختلفة من وحدات. bas هو من القيم بالموضع هو تقنية هو التي Measureيمكن تطبيق سمة على معلمة نوع.

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

وحدات في وقت التشغيل

وحدات المقياس المستخدمة للتحقق من نوع ثابت. عندما يتم ترجمة قيم النقطة العائمة، وحدات القياس يتم حلها، حيث يتم فقدان عند تشغيل الوحدات الوقت. ولذلك، أي محاولة لتنفيذ الوظيفة التي تعتمد تشغيل يتم الآن التدقيق من وحدات في وقت التشغيل هو غير ممكنة. على سبيل المثال، يطبق ToStringالدالة طباعة وحدات هو غير ممكن.

التحويلات

لتحويل أحد أنواع مع وحدات (على سبيل المثال، float<'u>) لنوع بدون وحدات، يمكنك استخدم دالة تحويل القياسي، على سبيل المثال، يمكنك استخدم floatللتحويل إلى unitless floatالقيمة.

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

ل تحويل القيمة unitless إلى القيمة باستخدام وحدات، يمكنك ضرب القيمة 1 أو 1.0 annotated مع وحدات المناسبة. ومع ذلك، لكتابة طبقات التوافق، هناك أيضا بعض وظائف explicit التي تستخدمها إلى تحويل قيم unitless إلى قيم باستخدام وحدات. هذه في وحدة نمطية? Microsoft.FSharp.Core.LanguagePrimitives. على سبيل المثال، لتحويل من unitless float float<cm>، استخدم من FloatWithMeasure.

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

وحدات القياس في يحزم قوة ب #

تتوفر مكتبة وحدة في PowerPack ب #. تتضمن المكتبة وحدة وحدات SI و الثوابت الفعلية.

راجع أيضًا:

موارد أخرى

مرجع لغة ب #