Erlang:打印一个名称始终位于其前面的列表

Erlang: Printing a List with a name always in front of it

我刚开始学习Erlang,如果这个问题看起来有点简单,请多多包涵。

大家好。我已经考虑了一段时间,但我想出的任何一个似乎都没有用。

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

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

这是我目前的代码:

-module(testmodule).

-export([NameInFront/1]).

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

当我只输入一个单词时它工作得很好,我猜这是 NameInFront/1 部分的错误,但我希望它能够处理我输入的任何数量的单词。任何人都知道如何让我的函数处理多个输入?非常感谢。

我不太确定你的意思:你是否希望你的函数是可变的(采用灵活数量的参数),或者你在正确连接列表时遇到问题。

可变参数函数不是 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]]).

double [[]] 是因为 io:format/2 将一个列表作为它的第二个参数,而你想传递一个 one 的列表(本身就是一个列表)到一个单一的格式替换槽(“~tp”部分)。

需要注意的一件事是 大小写在 Erlang 中很重要。它有一个意义。模块和函数名称是 atoms,与 variables 不同。由于这个原因,它们必须是小写的,并且因为它们必须是小写才能开始,所以约定是在单词之间使用下划线而不是使用 CamelCase。因为,嗯,erlangIsNotCpp.

在 shell 中尝试一下您想要的功能的简单元素,一旦您解决了这些问题,就将其写入源文件并试一试。