Question

Existe-t-il un opérateur équivalent à l'opérateur de différence de liste de Haskell \\ en fa# ?

Était-ce utile?

La solution

A été rejeté, mais je pense que cela vaut la peine d'écrire ici la mise en œuvre de ( /-/ ) (la version F# de 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

Cela fonctionnera comme celui de Haskell \\, de sorte que (xs @ ys) /-/ xs = ys.Par exemple: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7] s'évalue en [1; 2; 3; 5; 7; 8; 9; 10; 11].

Autres conseils

Non...Écrivez-le simplement et faites-en un opérateur infixe – en utilisant le jeu de caractères spéciaux.Barre oblique inverse (\) n'est pas dans la liste ci-dessous, il ne fonctionnera donc pas comme opérateur infixe.Voir le manuel:

infix-op :=

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

**OP

préfixe-op :=

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

Filtrer les éléments de l'ensemble du sous-traitement :

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

J'utilise ceci :

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

Si quelqu'un voit un problème, faites-le-moi savoir.

Est destiné aux listes, il pourrait donc y avoir des doublons dans le résultat.Par exemple:

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

En supposant que vous souhaitiez vraiment une différence d'ensemble conventionnelle plutôt que l'étrange soustraction multiensemble ordonnée mais non triée que Haskell fournit apparemment, convertissez simplement les listes en ensembles à l'aide du set fonction, puis utilisez la fonction intégrée - opérateur pour calculer la différence définie :

set xs - set ys

Par exemple:

> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top