Erlang:列出对现有列表的理解

时间:2010-11-21 13:32:29

标签: list datetime erlang list-comprehension

我正在尝试通过列表推导创建新列表,但希望这些新值包含在现有列表中。

更具体地说,我尝试在日期之外创建一个字符串,并且在值之间会有一些字符串格式(短划线 - )。如果您使用短划线,现有列表将成为模板。

这是我到目前为止所做的:

{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理解“理解”在第一个和第二个元素之后带有“ - ”的现有列表。

任何带有具体代码示例的建议都非常赞赏。

3 个答案:

答案 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"

答案 1 :(得分:4)

如果您真的想要列表理解,那么您可以执行以下操作:

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

罗伯托是一个更好/更有效的解决方案,但如果你想知道如何通过列表理解这样做,这将是一种方式。

答案 2 :(得分: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"