Je suis complètement nouveau à Haskell (et plus généralement à la programmation fonctionnelle), alors pardonnez-moi si c'est vraiment des trucs de base. Pour obtenir plus d'un goût, j'essaie de mettre en œuvre à Haskell quelques éléments algorithmiques que je travaille. J'ai un simple module la fonction d'assistance p> et certaines fonctions utilitaires sur les intervalles. P> Ici, mon intérêt réside dans des intervalles multidimensionnels (intervalles D), ces objets composés d'intervalles D. Je tiens à envisager séparément des intervalles D qui sont l'union des intervalles de disjoint D sur la ligne (intervalle multiple) de ceux qui sont l'union d'intervalle D sur D (intervalle de piste). Avec des traitements algorithmiques distincts à l'esprit, je pense que ce serait bien d'avoir deux types distincts (même si les deux sont des listes d'intervalles ici) tels que p> pour permettre une santé mentale distincte Les chèques, par exemple p> Je vais maintenant au point, enfin! Mais certaines fonctions sont naturellement concernées par plusieurs intervalles et intervalles de piste. Par exemple, une fonction intervalle code> qui implémente les intervalles sur la ligne. Il contient le type commande code> retournerait le nombre d'intervalles dans un intervalle multiple ou un intervalle de piste. Que puis-je faire? Ajouter p> order :: DInterval t -> Int
order (MIntervalStuff (MInterval is)) = length is
order (TIntervalStuff (TInterval is)) = length is
4 Réponses :
Considérez l'utilisation de typclasses pour montrer des similitudes entre différents types. Voir le tutoriel Haskell [1] sur les classes et la surcharge de l'aide. P>
[1]: http://www.hakell.org/taturial/classes.html < / a> Tutoriel Haskell P>
Ce que vous voulez être des types avec la même structure et les mêmes opérations, mais qui peuvent être distingués et pour lesquels certaines opérations n'ont aucun sens sur un ou plusieurs types. L'idiome pour cela à Haskell est des types fantômes. P>
Edit: Ceci est la même idée que la réponse de SCLV; Ses liens fournissent plus d'informations sur cette technique.
Qu'en est-il de cette approche? P>
makeInterval is = maybe
(Left $ DInterval TInterval is)
Right
(makeMInterval is)
Un grand merci à vous tous. C'est exactement que je cherchais. En outre, je pense que je pourrai envisager mes bienfaits supplémentaires (tous les intervalles ont la même longueur, la même longueur, ...) en utilisant la même approche, quelque chose comme des données Dinterval Abt = Dinterval [I.Interval T], où une volonté Comme Minterval OrtInterval et B comme équilibré, unité, ...
Quant à la note peut-être ... La seule chose que j'ai vraiment comprise à propos de ce que c'est un concept important. Je veux dire que je comprends peut-être localement (pour représenter un calcul pouvant échouer), un peu moins comment utiliser >> = avec peut-être (dans certains tutoriels, j'ai trouvé ce sympa). Cependant, l'utiliser pour chaque jour n'est toujours pas clair pour moi. Si je veux définir les deux matières et Makeminterval avec peut-être, je suis en difficulté puisque à Makeminterval depuis que je m'attends à [I.Interval t], pas [peut-être (i.Interval t)]. Ok je dois en savoir plus à ce sujet.
Avez-vous lu le chapitre peut-être Lyah? apprenonnez-vous
Ce que vous voulez est une typlass. Les typlasses correspond à la manière dont la surcharge est faite à Haskell. Une classe de type est une structure commune partagée par de nombreux types. Dans votre cas, vous souhaitez créer une classe de tous types qui ont un Commander CODE> Fonction: instance Group Integer where:
identity = 0
inverse x = (- x)
x <*> y = x + y
Tout comme un côté,
replier (&&) true == et code>.