# نتف النموذج الأولي في F #؟
-
09-06-2019 - |
سؤال
في 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
ومع ذلك، باستخدام Compatibility
من المحتمل أن يجعل الأمور أكثر إرباكًا للأشخاص الذين ينظرون إلى الكود الخاص بك.