我刚刚开始学习Erlang所以如果这个问题看起来有点简单,请耐心等待.
嗨,大家好.我已经考虑了一段时间,但我想出的任何事情似乎都在起作用.
我正在编写一个Erlang函数,该函数应该将列表作为参数,然后在其前面打印带有我名字的列表.出于这个问题的目的,让我们说我的名字是"詹姆斯".
如果我输入testmodule:NameInFront("Legible", "Hey", "Think").
Erlang应该返回["James", "Legible", "Hey", "Think"]
这是我到目前为止的代码:
-module(testmodule).
-export([NameInFront/1]).
NameInFront(List)-> ["James"]++[List].
当我输入一个单词时,它工作得很好,我猜这是NameInFront/1部分的错误,但我希望它能够处理我输入的任何数量的单词.任何人都知道如何让我的函数处理多个输入?非常感谢你.
我不太清楚你的意思:你是否希望你的函数是可变参数(采用灵活数量的参数),或者你无法正确地将列表连接在一起.
变量函数不是Erlang的工作方式.FunctionName/Arity在Erlang中定义函数的具体标识(在此讨论).因此,我们使函数采用多个参数的方法是将一个(或多个)参数作为列表:
print_terms(Terms) -> io:format("~tp~n", [Terms]).
Run Code Online (Sandbox Code Playgroud)
该io:format/2函数本身实际上是将列表作为其第二个功能,这是它如何与的参数个数可变涉及:
print_two_things(ThingOne, ThingTwo) ->
io:format("~tp~n~tp~n", [ThingOne, ThingTwo]).
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您希望接受一系列事物,将名称添加到其中,然后将其打印出来.这是一种方法.
name_in_front(ListOfStrings) ->
NewList = ["James" | ListOfStrings],
io:format("~p~n", [NewList]).
Run Code Online (Sandbox Code Playgroud)
使用++运算符是另一个(实际上是递归操作的不同语法,它扩展到完全相同的东西):
name_in_front(ListOfStrings) ->
NewList = ["James"] ++ ListOfStrings,
io:format("~tp~n", [NewList]).
Run Code Online (Sandbox Code Playgroud)
但这有点傻,因为它旨在以two简单的方式将字符串连接在一起,在这种情况下,它使语法看起来很奇怪.
另一种方法是更简单地编写一个带有两个参数并完成同样事情的函数:
any_name_in_front(Name, ListOfThings) ->
io:format("~tp~n", [[Name | ListOfThings]]).
Run Code Online (Sandbox Code Playgroud)
double [[]]是因为io:format/2将列表作为其第二个参数,并且您希望将一个事物(本身是列表)的列表传递到单个格式替换槽("〜tp"部分).
有一点需要注意的是,资本化在Erlang中很重要.它有意义.模块和函数名称是原子,与变量不同.出于这个原因,它们必须是小写的,并且因为它们必须小写才能从约定开始使用单词之间的下划线而不是usingCamelCase.因为,好吧,erlangIsNotCpp.
使用你想要的函数的简单元素在shell中玩一下,一旦你把它们解决了,就把它写成源文件然后尝试一下.