كيفية القيام تعبيرات لامدا متعدد الأسطر في F #؟

StackOverflow https://stackoverflow.com/questions/814278

  •  03-07-2019
  •  | 
  •  

سؤال

وكيف أفعل ذلك (C #) في F #

public class MyClass
{
    void Render(TextWriter textWriter)
    {
        Tag(() =>
                {
                    textWriter.WriteLine("line 1");
                    textWriter.WriteLine("line 2");
                });
        Tag(value =>
                {
                    textWriter.WriteLine("line 1");
                    textWriter.WriteLine(value);
                }, "a");
    }

    public void Tag(Action action)
    {
        action();
    }
    public void Tag<T>(Action<T> action, T t)
    {
    action(t);
    }
}
هل كانت مفيدة؟

المحلول

وA امدا متعدد الخطوط في F # هو مجرد

(fun args ->
    lots
    of
    code
    here
)

والرمز كله سيكون شيء من هذا القبيل

open System.IO

type MyClass() as this =
    let Render(tw : TextWriter) =
        this.Tag(fun() ->
            tw.WriteLine("line1")
            tw.WriteLine("line2")
        )
        this.Tag(fun(value : string) ->
            tw.WriteLine("line1")
            tw.WriteLine(value)
        , "a"
        )
    member this.Tag(action) = 
        action()
    member this.Tag(action, x) =
        action(x)

وعلى افتراض أدليت به أية أخطاء النسخ. (كنت F أنواع # وظيفة بدلا من المندوبين العمل في الواجهة العمومية).

نصائح أخرى

وإذا كان كل ما تريد القيام به هو إرسال lambdas متعدد الخطوط، يمكنك سلسلة العديد من البيانات معا باستخدام المشغل منقوطة داخل قوسين. مثال:

(fun () -> (write_line "line 1" ; write_line "line 2"))

و

(fun val -> (write_line "line 1" ; write_line val))

وعلى الرغم من أن المثال الثاني أعطى يعمل فقط إذا كان نوع فال هو السلسلة.

تحذير: أنا لا أعرف تفاصيل F #. أنا أكتب هذا من خلفية CAML الهدف. اللغات متشابهة جدا، ولكن قد يكون هناك بعض الاختلافات التي تجعل اقتراحي الخطأ قليلا. أيضا، وأنا لست في جهاز مع لغة كامل الموضوعية أو F # مترجم حتى الآن لا أستطيع التحقق من هذه القصاصات للتأكد من أنها تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top