Je souhaite utiliser OCaml pour générer des ensembles de données et effectuer des comparaisons entre eux. J'ai vu la documentation pour les types de module comme Set.OrderType
, Set.Make
, etc, mais je ne peux pas comprendre comment initialiser un ensemble ou autrement les utiliser.OCaml: Définir les modules
Répondre
Les ensembles sont définis à l'aide d'une interface fonctoriale. Pour un type donné, vous devez créer un module Set
pour ce type en utilisant le foncteur Set.Make
. Un mauvais contrôle des bibliothèques standard est qu'elles ne définissent pas Set
instances pour les types intégrés. Dans la plupart des cas, il suffit d'utiliser Pervasives.compare
. Voici une définition qui fonctionne pour int
:
module IntSet = Set.Make(
struct
let compare = Pervasives.compare
type t = int
end)
Le module IntSet
mettra en œuvre l'interface Set.S
. Maintenant, vous pouvez utiliser sur les jeux utilisant le module IntSet
:
let s = IntSet.empty ;;
let t = IntSet.add 1 s ;;
let u = IntSet.add 2 s ;;
let tu = IntSet.union t u ;;
Notez que vous ne devez pas définir explicitement la structure d'entrée pour Set.Make
comme OrderedType
; l'inférence de type fera le travail pour vous. Sinon, vous pouvez utiliser la définition suivante:
module IntOrder : Set.OrderedType = struct
type t = int
let compare = Pervasives.compare
end
module IntSet = Set.Make(IntOrder)
Ceci a l'avantage que vous pouvez réutiliser le même module pour instancier un Map
:
module IntMap = Map.Make(IntOrder)
Vous perdez généricité en utilisant foncteurs, parce que le type des éléments est fixe. Par exemple, vous ne serez pas en mesure de définir une fonction qui prend un Set
de type arbitraire et effectue une opération dessus. (Heureusement, le module Set
se déclare de nombreuses opérations utiles sur Set
s.)
En plus de la réponse de Chris, il peut être utile de dire que certains modules de la bibliothèque standard adhèrent déjà à la signature OrderedType
. Par exemple, vous pouvez simplement faire:
module StringSet = Set.Make(String) ;; (* sets of strings *)
module Int64Set = Set.Make(Int64) ;; (* sets of int64s *)
module StringSetSet = Set.Make(StringSet) ;; (* sets of sets of strings *)
Et ainsi de suite.
Voici un exemple d'utilisation simple pour StringSet
; rappelez-vous que les ensembles sont des structures de données fonctionnelles, afin d'ajouter un nouvel élément à un ensemble renvoie un nouvel ensemble:
let set = List.fold_right StringSet.add ["foo";"bar";"baz"] StringSet.empty ;;
StringSet.mem "bar" set ;; (* returns true *)
StringSet.mem "zzz" set ;; (* returns false *)
- 1. Ocaml: Définir le répertoire de travail actuel?
- 2. Implémentation de Singleton classique dans OCaml
- 3. Fonctions récursives dans les objets OCaml
- 4. Gestion des dépendances circulaires dans OCaml
- 5. Problème avec les modules Python
- 6. La communication entre les modules
- 7. Functors in Ocaml
- 8. Comment puis-je définir le chemin d'inclusion de Perl pour les modules d'un script CGI?
- 9. OCaml: Comment fonctionne List.fold_left?
- 10. Ocaml - Itératif à récursion
- 11. Envelopper ma tête autour OCaml
- 12. OCaml typage structurel et listes
- 13. Types OCaml avec différents niveaux de spécificité
- 14. Comment supprimer les espaces d'une chaîne dans OCaml?
- 15. Valeur absolue pour les flotteurs dans le noyau OCaml
- 16. Quelles sont les différences entre SML et OCaml?
- 17. OCaml: valeurs par défaut pour les arguments de fonction?
- 18. Quels sont les autres programmes OCaml de niveau supérieur? (Vista)
- 19. UML pour OCaml objets immédiats
- 20. OCaml: Type Vérification des objets
- 21. Ocaml valeurs Int et négatives
- 22. Question OAM de base OCaml
- 23. Py2App Impossible de trouver les modules standard
- 24. comment les modules peuvent être liés
- 25. Comment utiliser les modules avec Zend_Application?
- 26. Comment utiliser les modules EXSLT dans XMLSpy?
- 27. y compris les modules de contrôleur
- 28. Diviser les modules F # entre plusieurs fichiers
- 29. Excluant les méthodes des modules GWT
- 30. Comment partager un fichier de filtre parmi les modules Maven2?
« vous ne serez pas en mesure de définir une fonction qui prend un ensemble d'un certain type arbitraire » que vous pourriez, cependant, accomplissez la même chose en définissant la fonction à l'intérieur d'un foncteur qui prend en paramètre votre module Set spécifique. mais pour l'utiliser bien sur le programmeur devrait faire encore un autre module avec ce foncteur, donc c'est moins pratique – newacct
. Ce sont des foncteurs tout le long. –