2008-09-12 15 views

Respuesta

4

se ha rechazado, sin embargo, creo que vale la pena para escribir aquí la implementación de (/-/) (la versión F # de 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 

Esto funcionará como \\ de Haskell, de modo que (xs @ ys) /-/ xs = ys. Por ejemplo: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7] se evalúa en [1; 2; 3; 5; 7; 8; 9; 10; 11].

4

No ... Solo escríbelo y conviértalo en un operador infijo --utilizando el conjunto de caracteres especiales. La barra invertida (\) no se encuentra en la lista a continuación, por lo que no funcionará como un operador infijo. Ver el manual:

infija-op: =

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

**OP 

prefijo-op: =

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

"// funcionará como un operador infijo". No, no lo hará. Es un comentario de una sola línea en F #. –

-3

Suponiendo que realmente quiere diferencia de conjuntos convencionales en lugar de la extraña ordenada, pero -la substracción multiset sin resolver que aparentemente proporciona Haskell, simplemente convierta las listas en conjuntos usando la función incorporada set y luego use elintegradooperador para calcular la diferencia de conjuntos:

set xs - set ys 

Por ejemplo:

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

Esto no manejará los duplicados correctamente. –

+0

La edición aún no maneja los duplicados correctamente. El operador \\ no proporciona un comportamiento de diferencia de conjunto; proporciona un comportamiento de diferencia de bolsa. – ScottWest

+0

@Scott: Gracias. Parece que probablemente no vale la pena hacer una traducción fiel. Dudo que alguien quiera alguna vez esa funcionalidad ... –

1

Filtrar elementos del conjunto del sustraendo:

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

estoy usando esto:

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

Si alguien ve un problema, que me haga saber.

Es para listas, por lo que podría haber duplicados en el resultado. Por ejemplo:

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