سؤال

هل هناك عامل مكافئ لمشغل فرق قائمة هاسكل \\ في ف#؟

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

المحلول

لقد ارتدت، ولكن أعتقد أنه من المفيد أن أكتب هنا تنفيذ ( /-/ ) (الإصدار F# من Haskell's \\):

let flip f x y = f y x

let rec delete x = function
  | [] -> []
  | h :: t when x = h -> t
  | h :: t -> h :: delete x t

let inline ( /-/ ) xs ys = List.fold (flip delete) xs ys

سيعمل هذا مثل هاسكل \\, ، لهذا السبب (xs @ ys) /-/ xs = ys.على سبيل المثال: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7] يقيم في [1; 2; 3; 5; 7; 8; 9; 10; 11].

نصائح أخرى

لا...ما عليك سوى كتابتها وجعلها عامل تشغيل infix - باستخدام مجموعة الأحرف الخاصة.شرطة مائلة عكسية (\) غير موجود في القائمة أدناه، لذلك لن يعمل كعامل infix.انظر يدوي:

infix-op :=

or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP

**OP

البادئة المرجع :=

!OP ?OP ~OP -OP +OP % %% & &&

تصفية العناصر من مجموعة المطروح:

let ( /-/ ) xs ys =
    let ySet = set ys
    let notInYSet x = not <| Set.contains x ySet
    List.filter notInYSet xs

أنا أستخدم هذا:

let (/-/) l1 l2 = List.filter (fun i -> not <| List.exists ((=) i) l2) l1

إذا رأى أي شخص مشكلة، اسمحوا لي أن أعرف.

مخصص للقوائم، لذلك قد يكون هناك تكرارات في النتيجة.على سبيل المثال:

[1;1;2] /-/ [2;3] would be eq to [1;1]

بافتراض أنك تريد حقًا فرق المجموعة التقليدية بدلاً من عملية الطرح المتعددة المجموعات المرتبة ولكن غير المصنفة التي يوفرها هاسكل على ما يبدو، فما عليك سوى تحويل القوائم إلى مجموعات باستخدام الطريقة المضمنة set وظيفة ثم استخدم المدمج في - عامل لحساب الفرق المحدد:

set xs - set ys

على سبيل المثال:

> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top