سؤال

في JavaScript، باستخدام مكتبة النموذج الأولي، يكون البناء الوظيفي التالي ممكنًا:

var words = ["aqueous", "strength", "hated", "sesquicentennial", "area"];
words.pluck('length');
//-> [7, 8, 5, 16, 4]

لاحظ أن رمز المثال هذا يعادل

words.map( function(word) { return word.length; } );

تساءلت عما إذا كان هناك شيء مماثل ممكن في F#:

let words = ["aqueous"; "strength"; "hated";"sesquicentennial"; "area"]
//val words: string list
List.pluck 'Length' words
//int list = [7; 8; 5; 16; 4]

دون الحاجة إلى الكتابة:

List.map (fun (s:string) -> s.Length) words

قد يبدو هذا مفيدًا جدًا بالنسبة لي لأنه لن يتعين عليك كتابة وظائف لكل خاصية للوصول إليها.

هل كانت مفيدة؟

المحلول

لقد رأيت طلبك في القائمة البريدية لـ F#.آمل أن أتمكن من المساعدة.

يمكنك استخدام امتداد الكتابة والانعكاس للسماح بذلك.نقوم ببساطة بتوسيع نوع القائمة العامة باستخدام وظيفة النتف.ثم يمكننا استخدام pluck() في أي قائمة.ستُرجع الخاصية غير المعروفة قائمة تحتوي على سلسلة الخطأ كمحتوياتها الوحيدة.

type Microsoft.FSharp.Collections.List<'a> with
    member list.pluck property = 
        try 
            let prop = typeof<'a>.GetProperty property 
            [for elm in list -> prop.GetValue(elm, [| |])]
        with e-> 
            [box <| "Error: Property '" + property + "'" + 
                            " not found on type '" + typeof<'a>.Name + "'"]

let a = ["aqueous"; "strength"; "hated"; "sesquicentennial"; "area"]

a.pluck "Length" 
a.pluck "Unknown"

الذي ينتج النتيجة التالية في النافذة التفاعلية:

> a.pluck "Length" ;; 
val it : obj list = [7; 8; 5; 16; 4]

> a.pluck "Unknown";;
val it : obj list = ["Error: Property 'Unknown' not found on type 'String'"]

تحياتي حارة،

داني آشر

> > > > >

ملحوظة:عند الاستخدام <pre> بين قوسين زاوية حولها

<'a>
لم تظهر على الرغم من أنها تبدو جيدة في نافذة المعاينة.لم يعمل backtick بالنسبة لي.كان علي أن ألجأ إليك بالنسخة الملونة وهذا كله خطأ.لا أعتقد أنني سأنشر هنا مرة أخرى حتى يتم دعم بناء جملة FSharp بشكل كامل.

نصائح أخرى

النموذج الأولي pluck يستفيد من ذلك في Javascript object.method() بالضبط مثل object[method].

لسوء الحظ لا يمكنك الاتصال String.Length إما لأنها ليست طريقة ثابتة.ومع ذلك يمكنك استخدام:

#r "FSharp.PowerPack.dll" 
open Microsoft.FSharp.Compatibility
words |> List.map String.length 

http://research.microsoft.com/fsharp/manual/FSharp.PowerPack/Microsoft.FSharp.Compatibility.String.html

ومع ذلك، باستخدام Compatibility من المحتمل أن يجعل الأمور أكثر إرباكًا للأشخاص الذين ينظرون إلى الكود الخاص بك.

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