我不太确定您的意思:您是否希望您的函数是可变参数(采用灵活数量的参数),或者您无法将您的列表正确连接在一起。
可变参数函数不是 Erlang 的工作方式。 FunctionName/Arity 定义了 Erlang 中函数的具体标识 (discussed here)。所以我们让一个函数接受多个参数的方法是让一个(或多个)参数成为一个列表:
print_terms(Terms) -> io:format("~tp~n", [Terms]).
io:format/2 函数本身实际上将一个列表作为它的第二个函数,这就是它处理可变数量参数的方式:
print_two_things(ThingOne, ThingTwo) ->
io:format("~tp~n~tp~n", [ThingOne, ThingTwo]).
在您的情况下,您希望接受一个事物列表,将您的名字添加到列表中,然后打印出来。这是一种方法。
name_in_front(ListOfStrings) ->
NewList = ["James" | ListOfStrings],
io:format("~p~n", [NewList]).
使用++ 运算符是另一种方式(这实际上是递归操作的不同语法,它扩展为完全相同的东西,):
name_in_front(ListOfStrings) ->
NewList = ["James"] ++ ListOfStrings,
io:format("~tp~n", [NewList]).
但这有点傻,因为它旨在以一种简单的方式将two 字符串连接在一起,而在这种情况下,它会使语法看起来很奇怪。
另一种方法是更简单地编写一个接受两个参数并完成相同事情的函数:
any_name_in_front(Name, ListOfThings) ->
io:format("~tp~n", [[Name | ListOfThings]]).
双 [[]] 是因为 io:format/2 将列表作为其第二个参数,并且您希望将 one 事物的列表(本身是列表)传递到单个格式替换槽( “~tp”部分)。
需要注意的一点是,大写在 Erlang 中很重要。它有一个意义。模块名和函数名是atoms,与variables不同。出于这个原因,它们必须是小写的,并且因为它们必须是小写的,所以约定是在单词之间使用下划线而不是使用 CamelCase。因为,嗯,erlangIsNotCpp。
用你想要的函数的简单元素在 shell 中玩一下,一旦你把它们写到源文件中试试看。