Y a-t-il un moyen de créer une fonction d'ajout polymorphe dans OCAML qui fonctionne de manière égale pour les véhiculesT et les flotteurs? Donc, par exemple, si j'ai une fonction comme: p>
partielsums [1; 2; 3; 4; 5] code> je devrais obtenir
[1; 3; 6; dix; 15] code> mais cette fonction ne fonctionnera pas sur
[1.; 2.; 3.; 4; 5] code> parce que dans OCAML Ints et les flotteurs ne peuvent absolument pas être mélangé. Mais que se passe-t-il si je veux que ma fonction fonctionne également bien pour les listes et les listes de flotteurs d'int. Y a-t-il un type général de quels int et flotteur sont des sous-types? Si oui, qu'est-ce que c'est? Je suis un peu perdu sur celui-ci. Merci pour l'aide? P>
3 Réponses :
Le seul type commun pour Si vous êtes prêt à incliner votre liste avec une fonction Dans ce cas, les éléments de liste ne doivent pas nécessairement être des chiffres: p> une autre solution commune est de Utilisez une variante de type: p> int La liste code> et
float list code> est
"une liste code>, c'est-à-dire une liste de tout type du tout. Étant donné que le type d'élément peut être n'importe quoi, il n'y a pas d'opérations spécifiques que vous pouvez appliquer aux éléments. Donc, il n'y a pas de moyen simple d'écrire la fonction que vous souhaitez.
+ code> qui fonctionne sur ses éléments, vous pouvez résoudre le problème de cette façon. p>
pour certains types T em>, définissez un module, p> et certaines fonctions utilitaires telles que Vous pouvez obtenir le avec Implications modulaires (2014) par blanc, Bour et Yallop, vous pouvez écrire, p> qui permettra de permettre La définition d'un générique et em> surchargé alors il fonctionne également aussi bien pour les intenses et les flotteurs! P> avec polymorphisme paramétrique, no. Avec Polymorphisme ad-hoc , oui. H3>
partialsums code> qui s'appuient sur cet intérieur, P >
partialsums code> spécialisé dans des types particuliers t em>, p>
avec des implicites modulaires, oui, oui, oui! H3>
partialsums code>, p>
let int_test = partialsums [1; 2; 3; 4] ;;
let float_test = partialsums [1.0; 2.0; 3.0; 4.0]
let string_test = partialsums ["a"; "b"; "c"; "d"]
Très bonne réponse! Une typographie dans module implicite semigroup_string code>, je suppose que vous vouliez dire
type t = chaîne code>. En outre,
snd code> est présent dans
omniprésives code> (peut-être que c'est dans la réponse à des fins éducatives, cependant).
@Antontrunov: merci. Je ne savais pas pervasives.snd code> existait.
Les implicites modulaires ne sont pas encore dans OCAML, cependant, sont-ils? (à partir de 4.03)
Vous pouvez également essayer des modules de première classe, car la base ( https://github.com/janestreet/base/blob/57240d0d8403031f37e105351d7d928A6AAEA1524/src/container.ml#L17 ), par exemple: qui vous donne une jolie légère Syntaxe de poids: p>
C'est de loin la meilleure réponse aujourd'hui, car elle s'appuie sur les bibliothèques et la syntaxe existantes disponibles. :) Si ce n'est pas clair pour les nouveaux arrivants, Base est le nom de la norme alternative de Jane Street une bibliothèque. Il faut utiliser un gestionnaire de paquets et porte un peu de poids supplémentaire dans la compréhension des modules paraméturés. Mais ils ont également construit un livre autour de lui, étant le 2e édition du monde réel ocaml , qui a été "en cours" Pendant un moment maintenant, mais certainement n'est pas vide.
Maintenant, ma connaissance de OCAML est certes très limitée, mais même si vous utilisiez des types paramétrés, vous avez toujours besoin de différents opérateurs (
+ code> et
+. Code>) pour construire le Des sommes partielles car il n'y a pas d'opérateur d'addition polymorphe, non?