9
votes

Haskell Newbie sur des types

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 intervalle code> qui implémente les intervalles sur la ligne. Il contient le type xxx pré>

la fonction d'assistance p> xxx pré>

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> xxx pré>

pour permettre une santé mentale distincte Les chèques, par exemple p> xxx pré>

Je vais maintenant au point, enfin! Mais certaines fonctions sont naturellement concernées par plusieurs intervalles et intervalles de piste. Par exemple, une fonction 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


1 commentaires

Tout comme un côté, replier (&&) true == et .


4 Réponses :


0
votes

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.

[1]: http://www.hakell.org/taturial/classes.html < / a> Tutoriel Haskell


0 commentaires


5
votes

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)


3 commentaires

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



3
votes

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 


0 commentaires