52 votes

Quelle est la chose la plus proche des classes de type de Haskell en OCaml ?

Quels sont les moyens de réaliser en OCaml ce que font les classes de type de Haskell ? Fondamentalement, je veux écrire une fonction polymorphe sans écrire trop de code. La façon typique de faire du polymorphisme est de fournir un argument supplémentaire indiquant à la fonction le type sur lequel elle travaille actuellement. Par exemple, si je veux trier une liste d'ints, je dois passer un comparateur supplémentaire à la fonction.

type comparison = Lesser | Equal | Greater

my_sort : (a' -> a' -> comparison) -> 'a list -> 'a list

Existe-t-il un moyen de dire à OCaml que mon type est comparable sans écrire une fonction de comparaison pour chaque type que je veux trier ? Ce qui signifie que ma fonction de tri ressemblerait à ceci :

my_sort : 'a list -> 'a list

2voto

glennsl Points 9939

Cela peut également être fait en utilisant des modules de premier ordre à la place des foncteurs. Pour faciliter la comparaison, voici une traduction de l'exemple de Réponse de Thomas :

module type COMPARABLE = sig
  type t
  val compare: t -> t -> int
end

let my_sort (type a) (module C: COMPARABLE with type t = a) (l: a list) =
  List.sort C.compare l

(* You can now use instantiate the functor *)
module IntAscending = struct
  type t = int
  let compare = (-)
end
module IntDescending = struct
  type t = int
  let compare x y = y - x (* Reverse order *)
end

Utilisation :

my_sort (module IntAscending) [3; 2; 9; 5; 7];;
- : IntAscending.t list = [2; 3; 5; 7; 9]

my_sort (module IntDescending) [3; 2; 9; 5; 7];;
- : IntDescending.t list = [9; 7; 5; 3; 2]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X