11
votes

Faire fonction OCAML polymorphe pour les listes et les listes de flotts

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:

partielsums [1; 2; 3; 4; 5] je devrais obtenir [1; 3; 6; dix; 15] mais cette fonction ne fonctionnera pas sur [1.; 2.; 3.; 4; 5] 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?


1 commentaires

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 ( + et +. ) pour construire le Des sommes partielles car il n'y a pas d'opérateur d'addition polymorphe, non?


3 Réponses :


11
votes

Le seul type commun pour int La liste et float list est "une liste , 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.

Si vous êtes prêt à incliner votre liste avec une fonction + qui fonctionne sur ses éléments, vous pouvez résoudre le problème de cette façon. xxx

Dans ce cas, les éléments de liste ne doivent pas nécessairement être des chiffres: xxx

une autre solution commune est de Utilisez une variante de type: xxx


0 commentaires

16
votes

Edit: strong> tandis que cette réponse contient une valeur théorique, vous souhaitez lire La réponse de Neo A> De nos jours. em>

avec polymorphisme paramétrique, no. Avec Polymorphisme ad-hoc , oui. H3>

pour certains types T em>, définissez un module, p> xxx pré>

et certaines fonctions utilitaires telles que partialsums code> qui s'appuient sur cet intérieur, P > xxx pré>

Vous pouvez obtenir le partialsums code> spécialisé dans des types particuliers t em>, p> xxx pré> Qui est un peu cool, mais aussi un peu fastidieux; Vous devez toujours préfixer vos fonctions avec quelque chose de type spécifique, mais au moins vous devez seulement écrire les fonctions une fois. Ceci est juste le système de module étant génial. P>

avec des implicites modulaires, oui, oui, oui! H3>

avec Implications modulaires (2014) par blanc, Bour et Yallop, vous pouvez écrire, p> xxx pré>

qui permettra de permettre La définition d'un générique et em> surchargé partialsums code>, p> xxx pré>

alors il fonctionne également aussi bien pour les intenses et les flotteurs! 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"]


3 commentaires

Très bonne réponse! Une typographie dans module implicite semigroup_string , je suppose que vous vouliez dire type t = chaîne . En outre, snd est présent dans omniprésives (peut-être que c'est dans la réponse à des fins éducatives, cependant).


@Antontrunov: merci. Je ne savais pas pervasives.snd existait.


Les implicites modulaires ne sont pas encore dans OCAML, cependant, sont-ils? (à partir de 4.03)



2
votes

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: xxx

qui vous donne une jolie légère Syntaxe de poids: xxx


1 commentaires

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.