الاتحادات discriminated (F#)

Discriminated الاتحادات provide دعم for قيم that can be واحد of a رقم of named cases, possibly each مع different قيم و أنواع. Discriminated الاتحادات are useful for heterogeneous بيانات; بيانات that can have خاص cases, including صالح و خطأ cases; بيانات that varies في نوع من واحد مثيل إلى another; و كـ an بديل for مربع متوسط كائن hierarchies. في addition, عودى discriminated الاتحادات are used إلى represent شجرة بيانات structures.

type type-name =
   | case-identifier1 [of type1 [ * type2 ...]
   | case-identifier2 [of type3 [ * type4 ...]
   ...

ملاحظات

Discriminated الاتحادات are similar إلى توحيد أنواع في لغات غير ذلك, but there are differences. كـ مع a توحيد نوع في C++ أو a variant نوع في Visual أساسى, the بيانات stored في the القيمة ليس ثابت; it can be واحد of several distinct خيارات. Unlike الاتحادات في these لغات غير ذلك, however, each of the possible خيارات هو given a حالة معرّف. معرفات حالة هما اسماً الممكنة المختلفة أنواع التي قد تكون الكائنات من هذا النوع؛ قيم اختيارية. إذا لم تكن موجودة، قيم الحالة هو مكافئة شاسيه قائمة تعداد. في حالة وجود القيم، يمكن أن تكون كل القيمة من نوع معين، أو المجموعة التي تجمع قيم متعددة من أنواع مختلفة أو نفس القيمة مفردة.

optionنوع هو توحيد dهوcriminated بسيطة في F# الأساسية المكتبة. optionنوع هو تعريف كما يلي.

// The option type is a discriminated union.
type Option =
    | Some of 'a
    | None

السابق تعيين تعليمات برمجية التي نوع Optionهو توحيد discriminated يحتوي على حالتي، Someو None. Someالحالة القيمة غير مقترنة نوعه هو يمثله نوع معلمة 'a. Noneعلى حالة لا القيمة المقترنة. وهكذا optionيحدد نوع نوع عام أما بقيمة بعض الأنواع أو عدم وجود القيمة. نوع Optionيحتوي أيضا على الاسم مستعار نوع صغيرة، option، لذلك هو أكثر استخداماً.

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

let myOption1 = Some(10.0)
let myOption2 = Some("string")
let myOption3 = None

يتم استخدام معرفات حالة أيضا في تعبيرات مطابقة نقش. في مطابقة النقش تعبير، يتم توفير معرفات للقيم المقترنة مع الحالات الفردية. على سبيل المثال، في التعليمة البرمجية التالية: xهو المعرّف إعطاء القيمة هو المقترنة Someحالة من optionالنوع.

let printValue opt =
    match opt with
    | Some x -> printfn "%A" x
    | None -> printfn "No value."

عادة، يمكن أن يتم استخدام معرفات حالة بدون مؤهلة إليهم بواسطة الاسم توحيد. إذا كنت تريد أن يكون مؤهلاً دائماً باسم التوحيد الاسم، يمكنك يطبق السمة RequireQualifiedAccess التوحيد نوع تعريف.

استخدام الاتحادات Discriminated بدلاً من كائن تسلسلات هرمية

يمكنك غالباً استخدام توحيد discriminated كبديل أبسط إلى التسلسل هرمي لكائن مربع متوسط. تشغيل سبيل المثال، قد يتم استخدام توحيد discriminated التالي بدلاً من Shapeإسناد الفئة التي تم اشتقاق أنواع لدائرة، مربع، و. هكذا

type Shape =
  // The value here is the radius.
| Circle of float
  // The value here is the side length.
| EquilateralTriangle of double
  // The value here is the side length.
| Square of double
  // The values here are the height and width.
| Rectangle of double * double

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

let pi = 3.141592654

let area myShape =
    match myShape with
    | Circle radius -> pi * radius * radius
    | EquilateralTriangle s -> (sqrt 3.0) / 4.0 * s * s
    | Square s -> s * s
    | Rectangle (h, w) -> h * w

let radius = 15.0
let myCircle = Circle(radius)
printfn "Area of circle that has radius %f: %f" radius (area myCircle)

let squareSide = 10.0
let mySquare = Square(squareSide)
printfn "Area of square that has side %f: %f" squareSide (area mySquare)

let height, width = 5.0, 10.0
let myRectangle = Rectangle(height, width)
printfn "Area of rectangle that has height %f and width %f is %f" height width (area myRectangle)

الإخراج هو كما يلي:

Area of circle that has radius 15.000000: 706.858347
Area of square that has side 10.000000: 100.000000
Area of rectangle that has height 5.000000 and width 10.000000 is 50.000000

استخدام الاتحادات Discriminated لبنيات بيانات شجرة

يمكن أن يكون discriminated توحيد s متداخلة، وهذا يعني التي توحيد نفسه يمكن تضمينها في نوع واحد أو المزيد الحالات. يمكن استخدام إلى الاتحادات discriminated عودى إنشاء الشجرة البنى، والتي تستخدم لتعبيرات الطراز في لغات البرمجة. في التعليمة البرمجية التالية، وتوحيد dهوcriminated العودية هو المستخدمة لإنشاء بنية بيانات شجرة ثنائية. يتكون التوحيد لحالتي، Node، وهو عقدة مع القيمة عدد صحيح والأشجار الفرعية يمين واليسار، و Tip، إنهاء شجرة.

type Tree =
    | Tip
    | Node of int * Tree * Tree

let rec sumTree tree =
    match tree with
    | Tip -> 0
    | Node(value, left, right) ->
        value + sumTree(left) + sumTree(right)
let myTree = Node(0, Node(1, Node(2, Tip, Tip), Node(3, Tip, Tip)), Node(4, Tip, Tip))
let resultSumTree = sumTree myTree

في تعليمات برمجية السابقة، resultSumTreeيحتوي القيمة 10. يبين الرسم التوضيحي التالي شجرة بنية myTree.

بنية شجرة myTree

مخطط الشجرة للوحدات المميزة

الاتحادات discriminated تعمل جيدا في حالة غير المتجانسة العقد الموجودة بالشجرة. في التعليمة البرمجية التالية، نوع Expressionتمثل شجرة مجردة بناء جملة التعبير في لغة برمجة بسيطة التي تعتمد الجمع والضرب من الأرقام والمتغيرات. بعض الحالات توحيد غير عودي و تمثل أحد الأرقام ( Number) أو المتغيرات ( Variable). حالات غير ذلك متداخلة، وتمثل العمليات ( Addو Multiply)، الموقع المعاملات كما تعتبر تعبيرات. Evaluateتستخدم دالة تعبير مطابقة إلى معالجة بشكل متكرر في شجرة بناء الجملة.

type Expression = 
    | Number of int
    | Add of Expression * Expression
    | Multiply of Expression * Expression
    | Variable of string
  
let rec Evaluate (env:Map<string,int>) exp = 
    match exp with
    | Number n -> n
    | Add (x,y) -> Evaluate env x + Evaluate env y
    | Multiply (x,y) -> Evaluate env x * Evaluate env y
    | Variable id    -> env.[id]
  
let environment = Map.ofList [ "a",1 ;
                               "b",2 ;
                               "c",3 ]
             
// Create an expression tree that represents
// the expression: a + 2 * b.
let expressionTree1 = Add(Variable "a",Multiply(Number 2,Variable "b"))

// Evaluate the expression a + 2 * b, given the
// table of values for the variables.
let result = Evaluate environment expressionTree1

عند تنفيذ هذه تعليمات برمجية، القيمة resultهو 5.

راجع أيضًا:

موارد أخرى

مرجع لغة ب #