عامل فرق قائمة هاسكل في F#
-
09-06-2019 - |
سؤال
هل هناك عامل مكافئ لمشغل فرق قائمة هاسكل \\
في ف#؟
المحلول
لقد ارتدت، ولكن أعتقد أنه من المفيد أن أكتب هنا تنفيذ ( /-/ )
(الإصدار 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]