Erlang ++运算符。句法糖,还是单独操作?

时间:2011-03-17 12:47:05

标签: erlang

简单的问题:Erlang的++运算符只是lists:concat的语法糖,还是完全不同的运算?我已经尝试过搜索这个,但谷歌不可能获得“++”并获得任何有用的东西。在寻求帮助时讨厌要求,但是答案的参考将是美妙的。感谢。

-tjw

5 个答案:

答案 0 :(得分:8)

X ++ Y实际上是lists:append(X, Y)的语法糖。

http://www.erlang.org/doc/man/lists.html#append-2

功能列表:concat / 2是一个不同的野兽。文档描述如下:“连接事物元素的文本表示。事物的元素可以是原子,整数,浮点数或字符串。”

答案 1 :(得分:7)

这是stdlib / lists模块中lists:concat/1的实现方式:

concat(List) ->
    flatmap(fun thing_to_list/1, List).

其中:

flatmap(F, [Hd|Tail]) ->
    F(Hd) ++ flatmap(F, Tail);
flatmap(F, []) when is_function(F, 1) -> [].

thing_to_list(X) when is_integer(X) -> integer_to_list(X);
thing_to_list(X) when is_float(X)   -> float_to_list(X);
thing_to_list(X) when is_atom(X)    -> atom_to_list(X);
thing_to_list(X) when is_list(X)    -> X.   %Assumed to be a string

因此,lists:concat/1实际上使用了'++'运算符。

答案 2 :(得分:4)

尚未提及++的一个重要用途:在模式匹配中。例如:

handle_url(URL = "http://" ++ _) -> 
    http_handler(URL);
handle_url(URL = "ftp://" ++ _) ->
    ftp_handler(URL).

答案 3 :(得分:3)

这是一个完全不同的操作。 ++是附加的普通列表。 lists:concat接受一个参数(必须是一个列表),对其元素进行字符串化,并连接字符串。

++:http://www.erlang.org/doc/reference_manual/expressions.html

列出:concat:http://www.erlang.org/doc/man/lists.html

答案 4 :(得分:1)

大多数列表函数实际上使用'++'运算符: 例如list:append / 2:

源代码对其定义如下:

-spec append(List1, List2) -> List3 when
      List1 :: [T],
      List2 :: [T],
      List3 :: [T],
      T :: term().

append(L1, L2) -> L1 ++ L2.