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 中尝试一下您想要的功能的简单元素,一旦您解决了这些问题,就将其写入源文件并试一试。
我刚开始学习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 中尝试一下您想要的功能的简单元素,一旦您解决了这些问题,就将其写入源文件并试一试。