¿Hay un operador equivalente al operador de diferencia de lista de Haskell \\
en F #?Haskell operador de diferencia de lista en F #
Respuesta
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]
.
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 % %% & &&
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]
Esto no manejará los duplicados correctamente. –
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
@Scott: Gracias. Parece que probablemente no vale la pena hacer una traducción fiel. Dudo que alguien quiera alguna vez esa funcionalidad ... –
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
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]
- 1. Función Operador de aplicación ($) en F #?
- 2. Operador de sobrecarga en F #: (/)
- 3. F # (.. ..) operador uso/sobrecarga
- 4. ¿Cómo creo un operador en Haskell?
- 5. F # Operador/Confusión de funciones
- 6. Operador de negación lógica en F #? (! -equivalente)
- 7. costo Tiempo de Haskell `operador seq`
- 8. comprensión de lista en F #
- 9. Haskell enumera la diferencia
- 10. Haskell operador punto
- 11. Haskell a F # - declare un tipo recursivo en f #
- 12. ¿Qué es [] (constructor de lista) en Haskell?
- 13. F # Tipo de declaración posible ala Haskell?
- 14. Haskell -> F #: Tamiz de Turner
- 15. F # para el programador C#/Haskell
- 16. F #: string.join y |> operador
- 17. ¿Hay una inversa del operador Haskell $?
- 18. ¿Se puede definir un operador (***) en F #?
- 19. ¿Tiene Scala un operador similar al `$` de Haskell?
- 20. Haskell: Lista de fusión, ¿dónde se necesita?
- 21. ¿F # tiene un equivalente a la toma de Haskell?
- 22. Haskell lista de lista de tuplas
- 23. Haskell operador vs función precedencia
- 24. Adición de enlace operador monádico de Haskell a Scala
- 25. Precedencia de Haskell: Lambda y el operador
- 26. ¿Qué hace el operador: infijo en Haskell?
- 27. Explicar Haskell lista de importación vacía()
- 28. F # Lista SelectMany
- 29. cómo implementar el operador de tubería directa F # en R?
- 30. Haskell Lista de Tupla Buscar
"// funcionará como un operador infijo". No, no lo hará. Es un comentario de una sola línea en F #. –