2008-09-12 9 views

Antwort

4

prallt wurde, aber ich glaube, dass es wert ist um hier die Implementierung von (/-/) (die F # -Version von Haskell's \\) zu schreiben:

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 funktioniert als Haskell \\, so dass (xs @ ys) /-/ xs = ys. Zum Beispiel: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7] wertet [1; 2; 3; 5; 7; 8; 9; 10; 11] aus.

4

Nein ... Einfach schreiben und es zu einem Infix-Operator machen - mit den Sonderzeichen. Backslash (\) ist nicht in der Liste unten, so dass es nicht als Infix-Operator funktioniert. Siehe die manual:

Infix-op: =

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

**OP 

Präfix-op: =

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

"// funktioniert als Infix-Operator". Nein, wird es nicht. Das ist ein einzeiliger Kommentar in F #. –

-3

Sie wirklich herkömmlichen Einstelldifferenzdruck anstatt die seltsame wollen Unter der Annahme bestellt, aber -unsortierte Multiset-Subtraktion, die Haskell scheinbar bietet, konvertieren Sie die Listen einfach mit der eingebauten set-Funktion in Sets und verwenden Sie dann das eingebaute - Operator die eingestellte Differenz zu berechnen:

set xs - set ys 

Zum Beispiel:

> set [1..5] - set [2..4];; 
val it : Set<int> = seq [1; 5] 
+3

Dies wird nicht korrekt mit Duplikaten umgehen. –

+0

Die Bearbeitung behandelt Duplikate immer noch nicht korrekt. Der \\-Operator bietet kein Set-Difference-Verhalten, sondern bietet ein Bag-Difference-Verhalten. – ScottWest

+0

@Scott: Danke. Sieht so aus, als ob es sich wahrscheinlich nicht lohnt, eine treue Übersetzung zu machen. Ich bezweifle, dass jemand jemals diese Funktionalität wollen würde ... –

1

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 
0

ich dies mit:

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 zu Duplikaten im Ergebnis kommen. Zum Beispiel:

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