将数组传递给erlang中的函数
passing arrays to a function in erlang
我是 erlang 编程的新手,事实上没有非常有经验的程序员。
我需要将一个数组传递给一个函数然后对其进行操作..但是到目前为止我还没有找到这个。
module(easy).
export([myfunction/1]).
myfunction([myarray]) ->
%% mycode.. hier I will need to do some stuff like getting the length of the array and I plan to pearse it to list first and get the length. is that efficient? then need to loop through
问题是当我运行程序像:
easy:myfunction([3,2,5]).
我收到 ** 异常错误:没有匹配的函数子句。
How could I pass an array to a function.
首先,Erlang 中没有数组数据类型,除非你指的是模块使用的数据结构 array
。有一个数据类型列表,有充分的理由称为列表。因为它是一个列表而不是数组。第二件事是,Erlang 中的变量必须以大写字母开头。所以你的代码应该是
-module(easy).
-export([myfunction/1]).
myfunction(MyList) ->
length(MyList).
然后你可以将列表传递给它
1> easy:myfunction([3,2,5]).
3
2>
Erlang中最接近数组的数据类型是元组,用{}
表示。所以你的代码看起来像:
myfunction(MyTuple) ->
tuple_size(MyTuple).
并被
使用
1> easy:myfunction({3,2,5}).
3
2>
请阅读 introduction 手册以掌握 Erlang 的基本原理。
正如 Hynek Vychodil 在他的回答中所说,Erlang 中没有内置数组类型。从某种意义上说,数组确实存在,因为您可以使用 array 模块获得 行为类似于 的(不可变)数组。
在 Erlang 中,以左括号开头的表达式,例如 [1, 2, 3]
,表示列表文字。虽然表面上相似,但列表和数组有很大不同。特别是,如果不首先扫描所有前面的元素,通常不可能访问列表中的元素。 更改 列表元素涉及复制所有前面的元素。因此,将列表用作数组的应用程序可能会遭受严重的性能损失。*
现在开始你的代码。宣言:
myfunction([myarray]) ->
%% ...
引入一个函数,其中只有一个子句 matches lists containing the atommyarray
,没有其他任何内容。这基本上意味着当你用任何其他列表调用 myfunction
时,Erlang 解释器会将它与列表 [myarray]
进行比较。这种比较将失败。由于只有一个功能子句,因此没有其他选项可供尝试。因此,解释器导致进程退出并出现 function_clause
错误。
另一方面,如果您这样调用函数:
use_it() ->
myfunction([myarray]).
该子句会匹配,您不会收到任何错误。但在我看来,你想要做的是拥有一个只接受任何旧列表作为其参数的函数。在那种情况下,你可以试试这个:
myfunction(List) ->
%% ...
大写的L很重要。正如我们所见,以小写字母开头的标识符表示一个原子。以大写字母或下划线开头的标识符表示变量。如果你想对你的列表做一些事情,也许需要它的长度,你可以将以下内容添加到函数体中:
myfunction(List) ->
length(List).
观察到 Erlang 中的函数隐式地 return 主体中最后一个表达式的值。
带回家的是,Erlang 中的函数的行为与您可能习惯的其他编程语言的行为完全不同。我鼓励您阅读我上面链接的 material 并尝试使用函数子句中的模式匹配概念,以加深您对 Erlang 的理解。
(*) 请注意,以上仅适用于 Erlang 和某些其他函数式语言。列表的概念通常没有很好的定义,可以用来指代行为更像数组的数据结构。 Python 也许是典型的例子。
我是 erlang 编程的新手,事实上没有非常有经验的程序员。 我需要将一个数组传递给一个函数然后对其进行操作..但是到目前为止我还没有找到这个。
module(easy).
export([myfunction/1]).
myfunction([myarray]) ->
%% mycode.. hier I will need to do some stuff like getting the length of the array and I plan to pearse it to list first and get the length. is that efficient? then need to loop through
问题是当我运行程序像:
easy:myfunction([3,2,5]).
我收到 ** 异常错误:没有匹配的函数子句。
How could I pass an array to a function.
首先,Erlang 中没有数组数据类型,除非你指的是模块使用的数据结构 array
。有一个数据类型列表,有充分的理由称为列表。因为它是一个列表而不是数组。第二件事是,Erlang 中的变量必须以大写字母开头。所以你的代码应该是
-module(easy).
-export([myfunction/1]).
myfunction(MyList) ->
length(MyList).
然后你可以将列表传递给它
1> easy:myfunction([3,2,5]).
3
2>
Erlang中最接近数组的数据类型是元组,用{}
表示。所以你的代码看起来像:
myfunction(MyTuple) ->
tuple_size(MyTuple).
并被
使用1> easy:myfunction({3,2,5}).
3
2>
请阅读 introduction 手册以掌握 Erlang 的基本原理。
正如 Hynek Vychodil 在他的回答中所说,Erlang 中没有内置数组类型。从某种意义上说,数组确实存在,因为您可以使用 array 模块获得 行为类似于 的(不可变)数组。
在 Erlang 中,以左括号开头的表达式,例如 [1, 2, 3]
,表示列表文字。虽然表面上相似,但列表和数组有很大不同。特别是,如果不首先扫描所有前面的元素,通常不可能访问列表中的元素。 更改 列表元素涉及复制所有前面的元素。因此,将列表用作数组的应用程序可能会遭受严重的性能损失。*
现在开始你的代码。宣言:
myfunction([myarray]) ->
%% ...
引入一个函数,其中只有一个子句 matches lists containing the atommyarray
,没有其他任何内容。这基本上意味着当你用任何其他列表调用 myfunction
时,Erlang 解释器会将它与列表 [myarray]
进行比较。这种比较将失败。由于只有一个功能子句,因此没有其他选项可供尝试。因此,解释器导致进程退出并出现 function_clause
错误。
另一方面,如果您这样调用函数:
use_it() ->
myfunction([myarray]).
该子句会匹配,您不会收到任何错误。但在我看来,你想要做的是拥有一个只接受任何旧列表作为其参数的函数。在那种情况下,你可以试试这个:
myfunction(List) ->
%% ...
大写的L很重要。正如我们所见,以小写字母开头的标识符表示一个原子。以大写字母或下划线开头的标识符表示变量。如果你想对你的列表做一些事情,也许需要它的长度,你可以将以下内容添加到函数体中:
myfunction(List) ->
length(List).
观察到 Erlang 中的函数隐式地 return 主体中最后一个表达式的值。
带回家的是,Erlang 中的函数的行为与您可能习惯的其他编程语言的行为完全不同。我鼓励您阅读我上面链接的 material 并尝试使用函数子句中的模式匹配概念,以加深您对 Erlang 的理解。
(*) 请注意,以上仅适用于 Erlang 和某些其他函数式语言。列表的概念通常没有很好的定义,可以用来指代行为更像数组的数据结构。 Python 也许是典型的例子。