كنت أنوي كتابة 1/2 منشورًا جيدًا على مدونة حول عبارات F # ، ولكن بعد ذلك فكرت ، وبصراحة ، لم أستطع رؤية الكثير من المزايا في تكرار ما هو متوفر بالفعل مجانًا على MSDN ، والذي يسرد جميع عبارات F #.
يمكنك العثور على قائمة كاملة بجميع عوامل التشغيل والحروف F # في صفحة MSDN هذه.إذا اتبعت هذا الرابط ، فإن أول شيء ستفهمه هو أن F # لديه الكثير من المشغلين والرموز ، وكثير جدًا بالنسبة لي لإدراجها في منشور مدونة واحد. مع وضع ذلك في الاعتبار ، لقد اعتزمت إنشاء نصف نشر مدونة لائق على المشغلين وقررت تقليص النطاق قليلاً لتتضمن فقط مناقشة المشغلين الأكثر شيوعًا ، لذلك أعتقد أنه يمكنك القول أن هذا سيكون 1/4 فقط أو 1/8 من وظيفة لائقة ، والتي أعتذر عنها بكل تواضع.
الآن ، قبل أن نبدأ ، أردت فقط أن أقول إنني سأذهب إلى أكثر المشغلين شيوعًا ؛ من المحتمل أن تضطر إلى دراسة ارتباط MSDN الذي قمت بتضمينه في بداية هذا المنشور عندما تبدأ بالفعل في استخدام F # ، لكن الآن أتمنى أن تكون الروابط التي نتناولها كافية لنا للبدء.
العوامل الحسابية
+ الجمع
غير المنضبط. شرط تجاوز سعة محتمل هو عندما يتم جمع الأرقام ويتجاوز المجموع الحد الأقصى للقيمة المطلقة التي يدعمها النوع.
- الطرح
غير المنضبط. شرط underfill ممكن عندما يتم طرح أنواع غير موقعة أو عندما تكون قيم الفاصلة العائمة صغيرة جدًا بحيث لا يمكن تمثيلها بالنوع.
* الضرب
غير المنضبط. شرط تجاوز سعة محتمل إذا تم ضرب الأرقام وتجاوز المنتج الحد الأقصى للقيمة المطلقة التي يدعمها النوع.
/ الشعبة
القسمة على صفر يثير DivideByZeroException لأنواع عدد صحيح. لأنواع الفاصلة العائمة ، يمنحك القسمة على صفر قيم الفاصلة العائمة الخاصة + اللانهاية أو -الانهاية. يمكن أن يكون شرط underfill ممكنًا أيضًا عندما يكون رقم الفاصلة العائمة أصغر من أن يتم تمثيله بنوع.
٪ وحدة
إرجاع باقي عملية القسمة. علامة النتيجة هي نفس علامة المعامل الأول.
** التعرض
شرط تجاوز سعة محتمل عندما تتجاوز النتيجة الحد الأقصى للقيمة المطلقة للنوع. عامل التشغيل الأسي يعمل فقط مع أنواع الفاصلة العائمة.
عرض
//Arithmetic operators printfn "25 + 25 = %i" (25 + 25) printfn "75 - 25 = %i" (75 - 25) printfn "12 * 12 = %i" (12 * 12) printfn "100 / 4 = %i" (100 / 4) printfn "101 %% 10 = %i" (101
وها هي نتيجة الإطلاق:

العوامل الثنائية
يوضح الجدول التالي عوامل المقارنة الثنائية المتاحة لأنواع الأعداد الصحيحة وأنواع الفاصلة العائمة. هذه العوامل ترجع قيم نوع منطقي.
= متساوي
هذا ليس مشغل مهمة. يتم استخدامه فقط للمقارنة. هذا هو المشغل العالمي.
> أكثر من
هذا هو المشغل العالمي.
أقل من
هذا هو المشغل العالمي.
> = أكبر من أو يساوي
هذا هو المشغل العالمي.
<= أكبر من أو يساوي
هذا هو المشغل العالمي.
<> غير متساو
هذا هو المشغل العالمي.
//Binary operators printfn "25 = 25 = %b" (25 = 25) printfn "26 > 25 = %b" (26 > 25) printfn "26 < 25 = %b" (26 < 25) printfn "26 >= 25 = %b" (26 >= 25) printfn "26 <= 25 = %b" (26 <= 25) printfn "'a' <= 'b' = %b" ('a' <> 'b') //how about a more complex example, a tuple printfn "(1,'a') = (2,'a') = %b" ((1,'a') = (2,'a')) printfn "(1,'a') = (1,'a') = %b" ((1,'a') = (1,'a')) printfn "Some(1) = Some(2) = %b" (Some(1) = Some(2)) printfn "Some(2) = Some(2) = %b" (Some(2) = Some(2))

العوامل المنطقية
يسرد الجدول التالي العوامل المنطقية المتاحة في F #. النوع الوحيد الذي تدعمه هذه العوامل هو نوع منطقي.
ليس
نفي منطقية
||
منطقية أو
&&
منطقية و
فيما يلي عرض صغير للمشغلين المنطقيين المذكورين أعلاه
//Boolean operators printfn "not true = %b" (not true) printfn "true || false = %b" (true || false) printfn "true && true = %b" (true && true) printfn "true && false = %b" (true && false)

مشغلي بت
يصف الجدول التالي معاملات bitwise المدعومة لأنواع الأعداد الصحيحة غير المعبأة في F #.
&&&
و bitwise المشغل. البتات كنتيجة لها قيمة 1 إذا وفقط إذا كانت البتات المقابلة في كل من معاملي المصدر هي 1.
|||
عامل التشغيل bitwise OR. البتات كنتيجة لها قيمة 1 إذا كان أي من البتات المناظرة في معاملات المصدر هو 1.
^^^
العامل الحصري bitwise "OR". البتات كنتيجة لها قيمة 1 إذا وفقط إذا كانت البتات في المعامِلات الأصلية لها قيم غير متساوية.
~~~
عامل إنكار bitwise. هذا هو عامل أحادي ينتج عنه تحويل جميع البتات 0 في المعامل الأصلي إلى 1 بت ، ويتم تحويل كل البتات 1 إلى 0 بت.
<<<
bitwise اليسار التحول المشغل. والنتيجة هي المعامل الأول مع تحول البتات إلى اليسار بعدد البتات في المعامل الثاني. البتات المنقولة من الموضع الأكثر أهمية لا تتحول إلى الموضع الأقل أهمية. هي مبطن الأقل بت أهمية مع الأصفار. نوع الوسيطة الثانية هو int32.
>>>
bitwise الصحيح المشغل التحول. والنتيجة هي المعامل الأول مع نقل البتات إلى اليمين بعدد البتات في المعامل الثاني. البتات المنقولة من الموضع الأقل أهمية لا تتحول إلى الموضع الأكثر أهمية. بالنسبة للأنواع غير الموقعة ، فإن البتات الأكثر أهمية مبطنة بالأصفار. بالنسبة للأنواع الموقعة ، فإن البتات الأكثر أهمية مبطنة بأخرى. نوع الوسيطة الثانية هو int32.
//Bit shift operators //&&& and printfn "2 &&& 4 (which is 0010 &&& 0100, should be 0) = %X" (2 &&& 4) printfn "2 &&& 3 (which is 0010 &&& 0011, should be 2) = %X" (2 &&& 3) //||| or printfn "2 ||| 4 (which is 0010 ||| 0100, should be 6) = %X" (2 ||| 4) printfn "2 ||| 3 (which is 0010 ||| 0011, should be 3) = %X" (2 ||| 3) //^^^ xor printfn "2 ^^^ 4 (which is 0010 ^^^ 0100, should be 6) = %X" (2 ^^^ 4) printfn "2 ^^^ 3 (which is 0010 ^^^ 0011, should be 1) = %X" (2 ^^^ 3) //^^^ negate printfn "~~~4 (which is not 0100, should be 1011 (B hex), or 11 decimal) = %X" (~~~4) //<<< bit shift left printfn "4 <<< 1 (which is 0100 <<< by 1 place left , should be 1000 (8 hex), or 8 decimal) = %X" (4 <<< 1) //>>> bit shift right printfn "4 >>> 1 (which is 0100 >>> by 1 place right , should be 0010 (2 hex), or 2 decimal) = %X" (4 >>> 1)

مشغل الزائد
كما ذكرت ، ستكون هناك أوقات تحتاج فيها إلى تنفيذ منطق المشغل الخاص بك. في لغات .NET الأخرى ، يمكن تحقيق ذلك من خلال توفير أحمال زائدة للمشغل الخاص بك. ليس من المستغرب ، عليك أن تفعل الشيء نفسه في F #. لم أكن أرغب في الذهاب إلى الفصول الدراسية و OO بعد ، ولكن يبدو أن ذلك يتسق مع المناقشة الحالية ، لذلك دعونا نرى كيف يمكنك تنفيذ العوامل الخاصة بك في F #.
لقد سرقت مرة أخرى من MSDN. توضح التعليمة البرمجية التالية فئة المتجهات التي تحتوي على عاملين اثنين فقط: أحدهما للسالب الأحادي والآخر للضرب بواسطة العددية. في هذا المثال ، هناك حاجة إلى حملين زائدين من أجل الضرب العددي ، حيث يجب أن يعمل المشغل بغض النظر عن الترتيب الذي يظهر به الموجه والحجم.
type Vector(x: float, y : float) = member this.x = x member this.y = y static member (~-) (v : Vector) = Vector(-1.0 * vx, -1.0 * vy) static member (*) (v : Vector, a) = Vector(a * vx, a * vy) static member (*) (a, v: Vector) = Vector(a * vx, a * vy) override this.ToString() = this.x.ToString() + " " + this.y.ToString()