2010-10-10 3 views
1

J'essaie de déclarer une fonction, liste de chaînes -> chaîne, qui avec l'entrée par exemple ["Chicago","city","USA"] devrait retourner "Chicago city USA". Ce que je l'ai fait jusqu'à présent était le suivant:Concaténation de chaînes avec foldr dans SML

fun gather ts = foldr op^"" ts; 

Cela semble être un peu le long des lignes, mais le problème est, je voudrais inclure les espaces entre les mots, car cette fonction reviendrait "ChigagocityUSA".

Répondre

3

Oui, le problème est que ^ est une fonction qui pour deux chaînes "foo" et "bar" renvoie "foobar", bien que vous vouliez "foo bar".

Donc, ce que vous devez faire est de définir une fonction qui prend deux arguments de chaîne (en tant que tuple) et retourne les deux chaînes avec un espace entre eux (donc string1^" "^string2).

Vous pouvez ensuite attribuer cette fonction en tant qu'argument à foldr et obtenir le résultat souhaité.

+0

je ne peux pas vraiment le faire fonctionner, je l'ai fait une nouvelle hj fun fonction ts = fn (a, b) => (a^» "^ b); – user457142

+0

@user: Vous ne savez pas à quoi sert le 'ts' puisque vous ne l'utilisez pas. Vous pouvez simplement faire 'val hj = fn (a, b) => (a ^" "^ b)' ou 'fun hj (a, b) = (a ^" "^ b)', qui est le même, mais plus court. Puis 'foldr hj" "ts', fonctionne bien. – sepp2k

+0

Ah bien sûr, merci beaucoup. Y a-t-il un moyen de supprimer le dernier espace qui se produit? – user457142

1

Utilisez hd et tl pour obtenir les valeurs initiales de fold. Cela évite d'avoir un caractère blanc avant ou arrière dans le résultat. foldl est utile si vous voulez penser de gauche à droite.

Définition:

fun gather xs = 
     foldl (fn (x,acc) => 
       acc^" "^x) (hd xs) (tl xs) 

Utilisation:

- gather ["what", "is", "this", "gather"]; 
val it = "what is this gather" : string 
-