2011-11-08 3 views
3

J'ai mon propre type de données:Haskell champs de type de données

type Types = String 
data MyType = MyType [Types] 

J'ai une fonction d'utilité:

initMyType :: [Types] -> MyType 
initMyType types = Mytype types 

Maintenant, je crée:

let a = MyType ["1A", "1B", "1C"] 

Comment puis-je obtenir la liste ["1A", "1B", "1C"] de a? Et en général, comment puis-je obtenir des données d'un constructeur de données?

Répondre

8

Outre l'utilisation de correspondance de motif, comme dans la réponse de arrowdodger, vous pouvez également utiliser la syntaxe d'enregistrement pour définir l'accesseur automatiquement:

data MyType = MyType { getList :: [Types] } 

Cela définit un type exactement le même que

data MyType = MyType [Types] 

mais définit également une fonction

getList :: MyType -> [Types] 

et permet (mais ne nécessite pas) la syntaxe MyType { getList = ["a", "b", "c"] } pour la construction des valeurs de MyType. Par ailleurs, initMyTypes n'est pas vraiment nécessaire à moins de faire quelque chose d'autre que de construire la valeur, car il fait exactement la même chose que le constructeur MyType (mais ne peut pas être utilisé dans la correspondance de modèle).

8

Vous pouvez motif correspondre quelque part dans votre code, ou écrire la fonction déconstruisant:

getList (MyType lst) = lst 
2

Il existe de nombreuses méthodes d'appariement de formes dans Haskell. Voir http://www.haskell.org/tutorial/patterns.html pour plus de détails sur l'endroit où les modèles peuvent être utilisés (par exemple, des déclarations de cas), et sur les différents types de modèles (modèles paresseux «comme » modèles, etc.)

1

(réponse pour les générations futures.)

Alors , votre tâche consiste à obtenir tous les champs d'un constructeur de type de données.
Voici une façon élégante de le faire.

Nous allons utiliser l'extension DeriveFoldable GHC, donc pour l'activer nous devons changer votre déclaration de type de données comme ceci: data MyType a = MyType [a] deriving (Show, Foldable).

Voici une façon générique d'obtenir toutes les données d'un constructeur de données.
C'est la solution tout:

{-# LANGUAGE DeriveFoldable #-} 

import Data.Foldable (toList) 

type Types = String 
data MyType a = MyType [a] deriving (Show, Foldable) 

main = 
    let a  = MyType ["1A", "1B", "1C"] :: MyType Types 
     result = toList a 
    in print result 

Imprimer le résultat vous donnera '[ "1A", "1B", "1C"]' que vous vouliez.

Questions connexes