التعبيرات احتساب (F#)

Computation expressions في F# provide a convenient بناء الجملة for writing computations that can be sequenced و combined using تدفق عناصر التحكم constructs و bindings. They can be used إلى provide a convenient بناء الجملة for monads, a functional programming ميزة that can be used إلى إدارة بيانات, عنصر تحكم, و side تأثيرات في functional البرامج.

Built-في Workflows

تسلسل expressions are an مثال of a computation تعبير, كـ are غير متزامن workflows. ل المزيد من المعلومات حول التعبيرات في التسلسل، راجع التسلسل. For المزيد معلومات حول غير متزامن workflows, see غير متزامن Workflows.

تكون بعض ميزات مشتركة لكلا التعبيرين التسلسل و غير متزامن مهام سير العمل وتوضيح بناء جملة تعبير احتساب أساسى:

builder-name { expression }

تعين بناء الجملة السابقة التي التعبير المقدم هو تعبير حساب من النوع المحدد بواسطة builder-name. يمكن أن يكون التعبير احتساب سير عمل مضمنة، مثل كـ seqأو async، أو قد يكون شيء ما تعرفه. builder-nameهو معرّف لمثيل من نوع خاص معروف كـ منشيء النوع . هو نوع منشيء نوع فئة التي تعرف خاص الأساليب التي تتحكم بطريقة دمج الأجزاء من حساب التعبير، هو الرمز الذي يتحكم بكيفية تنفيذ التعبير. هناك طريقة أخرى لوصف فئة منشيء هو قول أن تتيح إمكانية يخصص عمل الكثير من F# بنيات، مثل الحلقات والروابط.

في احتساب التعابير، تتوفر نموذجين لبعض بنية اللغة عام. يمكن استدعاء بنيات المتغير باستخدام! لاحقة (bang) تشغيل كلمات أساسية معينة، مثل كـ let!، do!، وهكذا دواليك. هذه خاص النماذج تؤدي وظائف معينة تم تعريفها في منشيء الفئة لاستبدال العادية سلوك المضمنة هذه العمليات. تشبه هذه النماذج yield!شكل yieldالكلمة الأساسية التي هو استخدامها في تعبيرات تسلسل. للحصول على مزيد من المعلومات، راجع التسلسل.

إنشاء نوع جديد من حساب التعبير

يمكنك تعريف سمات تعبيرات الحساب الخاص بك بواسطة إنشاء منشيء فئة و تعريف بعض الأساليب الخاصة تشغيل الفئة. يمكن clكـs منشيء تعريف الطرق كـ المسرودة في الجدول التالي.

يصف الجدول التالي وظائف التي يمكن استخدامها في فئة منشيء سير عمل.

Method

توقيع(s) النموذجية

الوصف

Bind

M<'a> * ('a -> M<'b>) -> M<'b>

استدعاء ل let!و do!في احتساب التعابير.

Delay

(unit -> M<'a>) -> M<'a>

التفاف تعبير احتساب كدالة.

Return

'a -> M<'a>

استدعاء ل returnفي احتساب التعابير.

ReturnFrom

M<'a> -> M<'a>

استدعاء ل return!في احتساب التعابير.

Combine

M<'a> * M<'a> -> M<'a>أو

M<unit> * M<'a> -> M<'a>

استدعاء للتسلسل في احتساب التعابير.

For

seq<'a> * ('a -> M<'b>) -> M<'b>

تسمى for...doتعبيرات في احتساب التعابير.

TryFinally

M<'a> * (unit -> unit) -> M<'a>

تسمى try...finallyتعبيرات في احتساب التعابير.

TryWith

M<'a> * (exn -> M<'a>) -> M<'a>

تسمى try...withتعبيرات في احتساب التعابير.

Using

'a * ('a -> M<'a>) -> M<'a> when 'a :> IDisposable

استدعاء useروابط في احتساب التعابير.

While

(unit -> bool) * M<'a> -> M<'a>

تسمى while...doتعبيرات في احتساب التعابير.

YieldFrom

M<'a> -> M<'a>

تسمى yield!تعبيرات في احتساب التعابير.

Zero

unit -> M<'a>

تسمى فارغ elseالفروع من if...thenتعبيرات في احتساب التعابير.

وظائف في سير عمل منشيء فئة استخدام والرجوع M<'a>بناء، والتي تكون عادة يكون من نوع معرف بشكل منفصل تصنيف أنواع حسابات تم دمجها، على سبيل المثال، Async<'a>لمهام سير العمل غير المتزامنة و Seq<'a>للتسلسل مهام سير العمل. التواقيع من هذه الأساليب تمكنها من تجميع وتتداخل مع بعضها البعض، حيث يمكن تمرير كائن سير العمل الذي تم إرجاعه من تركيبة واحدة إلى غير ذلك. The compiler, when it parses a computation تعبير, converts the تعبير في a series of nested دالة calls بواسطة using the وظائف in the preceding جدول و the تعليمات برمجية in the computation تعبير. The following تعليمات برمجية مثال illustrates the creation و استخدم of a simple computation تعبير نوع that generates some console إخراج that tracks the التقدم of the execution of تعليمات برمجية.

// Program.fs
open Module1

// Create the workflow object script1.
let trace1 = trace {
   // A normal let expression (does not call Bind).
   let x = 1
   // A let expression that uses the Bind method.
   let! y = 2
   let sum = x + y
   // return executes the Return method.
   return sum  
   }

// Execute the code. Start with the Delay method.
let result = trace1()

The following تعليمات برمجية implements the منشيء فئة for the trace computation تعبير.

// Module1.fs

// Functions that implement the builder methods.
let bind value1 function1 = 
    printfn "Binding %A." value1 
    function1 value1

let result value1 =
    printfn "Returning result: %A" value1
    fun () -> value1

let delay function1 =
    fun() -> function1 ()

// The builder class for the "trace" workflow.
type TraceBuilder() =
    member x.Bind(value1, function1) = 
        bind value1 function1
    member x.Return(value1)  = result value1
    member x.Delay(function1)   = 
        printfn "Starting traced execution."
        delay function1

let trace = new TraceBuilder()

The إخراج of this مثال هو كـ follows.

Starting traced execution.
Binding 2.
Returning result: 3

راجع أيضًا:

موارد أخرى

مرجع لغة ب #