2017-01-22 3 views
0

J'ai un type de données:Comment imprimer une valeur arborescente pas à pas?

datatype ex = A of int | B of ex * ex; 

et une variable d'exemple:

val x = (B (A 1, B (A 2, A 3))); 

Je veux être l'impression à travers elle comme ceci:

"(1, (2, 3))" 

Toute aide serait apprécié! Merci.

+2

Pensez récursivement et pattern-matchingly. – molbdnilo

Répondre

1

En supposant que cette jolie imprimante va être un pp: ex string →, voici un modèle:

fun pp (A i) = ... 
    | pp (B (ex1, ex2)) = ... 

Ce modèle de modèle correspond à contre chaque constructeur de valeurs possibles pour le type ex. Les modèles vont un niveau de profondeur, donc pour votre valeur d'exemple, ex1 est lié à A 2, et ex2 est lié à A 3 dans la première itération de l'appel. Vous voulez gérer ex1 et ex2 de manière récursive de la même manière que vous avez traité ex0 étant B (A 1, B (A 2, A 3)).

Pour les chaînes concaténer, vous pourriez envisager op ^: string × string → string ou String.concat: liste de chaînes chaîne →:

- val test1 = "hello"^"world"; 
> val test1 = "helloworld" : string 
- val test2 = String.concat [ "if ", "you've ", "got ", "many ", "strings!" ]; 
> val test2 = "if you've got many strings!" : string 

Pour les entiers jolie impression, vous pouvez envisager Int.toString: int → chaîne. Vous voudrez peut-être envelopper cette fonction, puisque Standard ML présente des entiers négatifs un peu funky:

- val test3 = Int.toString ~5; 
> val test3 = "~5" : string