2010-11-21 8 views
3

リストの理解を介して新しいリストを作成しようとしていますが、それらの新しい値を既存のリストに含めることを願っています。Erlang:リストの理解を既存のリストに

具体的には、日付から文字列を作成しようとしていますが、値の間に文字列の書式が設定されています(ダッシュ記号)。既存のリストはダッシュを付けてテンプレートになります。ここで

は、私がこれまで持っているものです。

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

結果が "20101121"

に沿って何かすることしかし、私がしたいことは "2010-11-21"

である必要があります

だから、私はDateListStringの理解を "最初の要素と2番目の要素の後に" - "が付いた既存のリストに"理解する "ことを考えています。

具体的なコードサンプルを添付していただきたいと思います。

+0

あなたは絶対にロベルトです...それについては申し訳ありません..。意図ではありませんでした。しかし、私は代わりに、私が良いと思ったすべての答えにポイントを与えました。今すぐ受け入れ部分を整流する... –

答えて

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

よくできたRoberto。 Damodharanよりも簡潔なので、答えとして選択します。 –

1

これは可能な解決策ですが、私はそれが優雅なものではないと感じています。また、リストの理解を使用しません。

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

おかげさま...私はちょうど今zipwithを探していた、誰かがよりエレガントなまたはリストの解解の解決策を思い付かないなら、それと一緒に行くかもしれない –

4

あなたが本当にリストの内包でそれをしたい場合は、次の操作を実行できます。

ロベルトさんがこれまでより良い/より効率的なソリューションですが、場合には、あなたはどのように疑問に思いましたリストの理解でこれを行うかもしれないが、これは一つの方法だろう。

+1

パターンマッチングが問題の興味深い解決策を明らかにする方法が大好きです。 –

+0

ありがとう、ジェレミー...はい、間違いなく見るのは面白いです。あなたの答えのポイントを追加しました。 –

+1

ロベルトのソリューションは、ベンチマークでない限り、より効率的なソリューションだとは書いていませんが、io_libはパフォーマンスの優勝者ではないことがよく知られています。 io_libが何をしなければならないか想像して私はあなたのソリューションに個人的に賭けるでしょう。 'lists:flatten/1'を' lists:append/1'に変更すると、パフォーマンスが向上します。 BEAMのほうがもっと速くても、「integer_to_list(Year)++」 - 「++ integer_to_list(Month)++」 - 「++ integer_to_list(Day)」でなければなりません。ネイティブでは手作りのソリューションが良いことができます。そして、NIFはもちろん支配します。 –