Haskell Liste Differenzoperator in F #
-
09-06-2019 - |
Frage
Gibt es ein Äquivalent Operator Haskell Liste Differenzoperator \\
in F #?
Lösung
Wurde prallt, aber ich glaube, dass es wert ist hier die Umsetzung von ( /-/ )
zu schreiben (das F # Version von Haskell \\
):
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
Dies wird als Haskells \\
arbeiten, so dass (xs @ ys) /-/ xs = ys
. Zum Beispiel: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7]
wertet in [1; 2; 3; 5; 7; 8; 9; 10; 11]
Andere Tipps
Nein ... es einfach schreiben und es ein Infixoperator --using den Satz von Sonderzeichen machen. Backslash (\
) ist nicht in der Liste unten, so wird es als Infixoperator nicht. Sehen Sie die Handbuch :
Infix-op: =
or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP **OP
Präfix-op: =
!OP ?OP ~OP -OP +OP % %% & &&
Filter Artikel aus der Menge der Subtrahend:
let ( /-/ ) xs ys =
let ySet = set ys
let notInYSet x = not <| Set.contains x ySet
List.filter notInYSet xs
Ich verwende diese:
let (/-/) l1 l2 = List.filter (fun i -> not <| List.exists ((=) i) l2) l1
Wenn jemand ein Problem sieht, lassen Sie es mich wissen.
Ist für Listen, so könnte es Duplikate in der Folge sein. Zum Beispiel:
[1;1;2] /-/ [2;3] would be eq to [1;1]
Angenommen, Sie wirklich herkömmliche Einstelldifferenzdruck wollen anstatt die seltsam geordnete-but-unsortiert multiset Subtraktion, die Haskell bietet offenbar konvertiert nur die Listen-Sets mit dem eingebauten in set
Funktion und dann die eingebauten in -
Operator zu berechnen die eingestellte Differenz:
set xs - set ys
Zum Beispiel:
> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]