2011-11-05 3 views
1

J'ai une liste dans SML, qui contient des membres du type de donnée "expr" (liste "b"). J'ai aussi la fonction "What", dont les arguments sont seulement de type day "expr". Maintenant, j'ai problème dans le code suivant:SML - listes et récursivité

datatype expr = K of string| Number2 of expr * (expr list); 
datatype number = Number1 of string | Number3 of int; 
What.... 
| What (Number2 (t,[]))= Number3(0)::What(t) 
| What (Number2 (y,(a::b)) = append (What(a), What(b)); 

L'erreur est survenue parce que b est la liste des expr, et la fonction What a obtenu que « expr » et non « expr list ». Tout ce que je veux faire est de vérifier tous les membres est "b", et faire une nouvelle liste - ce membre est du type de données "number". J'ai essayé d'utiliser map function, mais cela n'a pas aidé (voir les marques ici: SML - unbound variable or constructor).

Une idée? Il y a une autre façon de le faire, sans utiliser de carte? Je m'empile dessus pendant un jour ..

+0

Vous devez expliquer ce que vous entendez par « il n'a pas aidé », étant donné la solution que vous avez dans l'autre question. Ce n'est pas du tout clair ce que vous attendez d'une sortie correcte. Donner la définition complète de la fonction 'What' et un exemple d'entrée et de sortie attendue. –

+1

Notez également qu'au lieu d'utiliser votre fonction 'append', vous pouvez utiliser la fonction intégrée' @ '. Ce serait 'lst1 @ lst2'. –

+0

@ Jesper.Reenberg: Merci beaucoup! l'opérateur @ résout le problème! –

Répondre

9

Par souci d'obtenir la question fermée.

La fonction append que vous avez fait dans la question précédente:

fun append (nil, l2) = l2 
    | append (x::xs, l2) = x::append(xs, l2); 

peut être remplacé par le construit en append opérateur @. Comme le documentation describes:

l1 @ l2 
    returns the list that is the concatenation of l1 and l2.