Erlang:打印一个名称总是在它前面的列表

时间:2015-09-06 22:50:14

标签: list erlang

我刚刚开始学习Erlang,所以如果这个问题看起来有点简单,请耐心等待。

你好。我已经考虑了一段时间,但我想出的任何事情似乎都在起作用。

我正在编写一个Erlang函数,该函数应该将列表作为参数,然后使用我的名字在其前面打印列表。出于这个问题的目的,让我们说我的名字是" James"。

如果我输入testmodule:NameInFront("Legible", "Hey", "Think"). Erlang应该返回["James", "Legible", "Hey", "Think"]

这是我到目前为止的代码:

-module(testmodule).

-export([NameInFront/1]).

NameInFront(List)-> ["James"]++[List].

当我输入一个单词时,它工作得很好,我想这是NameInFront/1部分的错误,但我希望它能够处理我输入的任何数量的单词。任何人都知道我是怎么做的可以让我的功能来处理多个输入?非常感谢你。

1 个答案:

答案 0 :(得分:5)

我不太清楚你的意思:你是否希望你的函数是可变参数(采用灵活数量的参数),或者你无法正确地将列表连接在一起。

变量函数不是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将列表作为其第二个参数,并且您希望将一个事物列表(本身就是一个列表)传递给一个格式替换槽(" ~tp"部分)。

需要注意的一点是,Erlang中的大写字母很重要。它有意义。模块和函数名称是 atoms ,它们与 variables 不同。出于这个原因,它们必须是小写的,并且因为它们必须小写才能从约定开始使用单词之间的下划线而不是usingCamelCase。因为,好吧,erlangIsNotCpp。

使用你想要的函数的简单元素在shell中稍微玩一下,一旦你将它们解决,就把它写入源文件并试一试。