2010-11-21 42 views
3

J'essaie de créer une nouvelle liste via une liste de compréhension mais je veux que ces nouvelles valeurs soient incluses dans une liste existante.Erlang: Comprendre la liste d'une liste existante

Plus précisément, j'essaie de créer une chaîne en dehors de la date et aura une certaine mise en forme de chaîne entre les valeurs (un tiret -). La liste existante sera un modèle si vous voulez avec le tiret.

Voici ce que j'ai jusqu'à présent:

{Date, Time} = erlang:universaltime(). 
DateList = tuple_to_list(Date). 
DateListString = [ integer_to_list(X) || X < DateList ]. 
DateListStringConcatenate = lists:flatten(DateListString). 

Le résultat devrait être quelque chose le long "20101121"

Mais, ce que je veux est "2010-11-21"

Donc je pense à la compréhension de DateListString "comprenant" à une liste existante avec "-" après le premier et deuxième élément.

Toute suggestion accompagnée d'échantillons de code concret très appréciée.

+0

Vous êtes absolument Roberto ... Désolé à ce sujet .. n'était pas l'intention. Mais, j'ai plutôt donné des points à chaque réponse que je pensais être bon. Rectifier la partie accepter maintenant ... –

Répondre

7
1> {{Y,M,D},_} = erlang:universaltime(). 
{{2010,11,21},{16,42,56}} 
2> lists:flatten(io_lib:format("~p-~p-~p", [Y,M,D])). 
"2010-11-21" 
+0

Bien fait Roberto. Plus concis que Damodharan, donc le sélectionner comme réponse. –

1

C'est une solution possible, mais je pense que ce n'est pas une solution élégante. En outre, il n'utilise pas la compréhension de liste.

1> {Date, Time} = erlang:universaltime(). 
{{2010,11,21},{14,51,23}} 
2> DateList = tuple_to_list(Date). 
[2010,11,21] 
3> DateListString = lists:zipwith(fun(X,Y) -> integer_to_list(X) ++ Y end, DateList, ["-","-",""]).   
["2010-","11-","21"] 
4> DateListStringConcatenate = lists:flatten(DateListString). 
"2010-11-21" 
+0

Merci ... Je regardais dans zipwith tout à l'heure et pourrait aller avec si quelqu'un ne propose pas une solution plus élégante ou liste de compréhension –

4

Si vous voulez vraiment dans une compréhension de la liste, vous pouvez effectuer les opérations suivantes:

Roberto de est une meilleure/solution plus efficace pour cela, mais au cas où vous demandé comment vous pourrait le faire avec une compréhension de la liste ce serait un moyen.

+1

J'adore comment l'appariement de motifs révèle des solutions intéressantes aux problèmes. –

+0

Merci Jeremy ... oui, vraiment intéressant à voir. Ajout d'un point pour votre réponse. –

+1

Je n'écrirais pas que la solution de Roberto est une solution plus efficace à moins de la référencer, mais io_lib est bien connu que ce n'est pas un champion de la performance. Je parierais personnellement à votre solution, car imaginez ce que io_lib doit faire. Vous pouvez améliorer les performances en changeant 'lists: flatten/1' en' lists: append/1'. Encore plus rapide dans BEAM devrait être 'integer_to_list (Year) ++" - "++ integer_to_list (Month) ++" - "++ integer_to_list (Day)". En Native peut être une solution artisanale mieux. Et le FNI se prononcera bien sûr. –