2016-12-12 2 views
1

J'ai une question concernant la conversion entre deux types de données dans Haskell.Conversion entre deux types de flux

Considérez ce qui suit deux types de données

data Stream a = Cons a (Stream a) 

data Stream2 a = ST {shead :: a, stail :: Stream2 a} 

Q2: Ecrire

sToS2 :: Stream a -> Stream2 a 

s2ToS :: Stream2 a -> Stream a 

qui convertissent entre les deux représentations de flux

La première chose que j'ai du mal avec est le type de données Stream, Nous pouvons voir c'est une récurrence mais il n'y a pas de cas de base, ce qui me fait me demander si c'est en quelque sorte infini et comment je pourrais créer un type de données. De plus, le constructeur de Stream2 est donné en syntaxe d'enregistrement où l'un des champs est également quelque chose de type Stream2. Je comprends qu'il y avait une question similaire à temps où

data Ab = A | B 
data Cd = C | D 

fromAb :: Ab -> Cd 
fromAb A = C 
fromAb B = D 

toAb :: Cd -> Ab 
toAb C = A 
toAb D = B 

mais je ne suis pas sûr que je peux appliquer les réponses de cette question à ma confusion particulière.

Répondre

6

il n'y a aucun cas de base, ce qui me fait me demander si cela est en quelque sorte infinie

Il est!

et comment je pourrais continuer à créer un flux

récursive! Haskell est nonstrict, donc ce n'est pas un problème. Voici:

successors :: Num a => a -> Stream a 
successors start = Cons start $ successors $ start + 1 

λ> case successors 1 of Cons _ (Cons _ (Cons x _)) -> x 
3 

le constructeur pour Stream2 est donnée dans la syntaxe des enregistrements où l'un des champs est aussi quelque chose du type Stream2

En effet. Mis à part l'utilisation du sucre d'enregistrement, le type Stream2 est identique (ou, plus précisément, isomorphe) à Stream. On pourrait aligner les choses un peu pour faire des parallèles visuellement plus évidente:

data Stream a = Cons   a   (Stream a) 
data Stream2 a = ST { shead :: a, stail :: Stream2 a } 
-- [ 1 ]  [ 2 ]   [3]   [ 4 ] 
  1. Le type
  2. Le seul constructeur Type
  3. type du premier paramètre du constructeur
  4. Type de deuxième constructeur paramètre

Vous pouvez ignorer la syntaxe d'enregistrement lorsque vous écrivez les conversions.

sToS2 :: Stream a -> Stream2 a 
s2ToS :: Stream2 a -> Stream a 

sToS2 (Cons x xs) = ST x $ sToS2 xs 
s2ToS (ST x xs) = Cons x $ s2ToS xs 
+0

Merci de votre réponse, je suis en train de donner la mise en œuvre pour les deux fonctions sToS2 :: Stream -> Stream2 un s2ToS :: stream2 a -> Diffuser un Lorsqu'il convertit entre les deux Types de données. –

+0

@Maxtwelve Je sais, cette réponse est un travail en cours. Voir la dernière édition. –

+0

Nous vous remercions de votre réponse. L'opérateur Contre peut-il être utilisé pour un type de données qui n'est pas une liste? Peut-il être lu de la même manière que dans x est la tête et xs est la queue du type de données Stream? –