如何在Erlang中使用整个列表函数参数

时间:2018-03-03 09:26:04

标签: erlang

我可以理解我在文档中阅读的大多数[H|T]示例。我通常意味着我想使用列表中的HT部分。如果我想改用整个列表怎么办?示例代码:

-module(module_variable).
-export([main/0, list_suffix/1]).

variable() -> [1, 2, 3, 4, 5].

list_suffix([_H|T]) ->
        lists:suffix(variable, T).

main() ->
        io:fwrite("~p~n", [list_suffix([4, 5])]).

我得到的错误是:

6> module_variable:list_suffix([1,[4, 5]]).
** exception error: bad argument
     in function  length/1
        called as length(variable)
     in call from lists:suffix/2 (lists.erl, line 205)

帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以使用列表前面的多个值。您不能在中间跳过任意数量的值。由于在您的代码中您不知道要提前匹配的头部中有多少元素,因此模式匹配不能为您执行此操作。

一些例子:

设定:

1> A = [1, 2, 3, 4, 5].
[1,2,3,4,5]

匹配列表的前2个元素

2> [1, 2 | _ ] = A.
[1,2,3,4,5]
% Can pattern match to extract values
3> [B, C | _ ] = A.    
[1,2,3,4,5]
4> B.
1
5> C.
2

可以匹配一些常量值并分配

6> [1, 2, D | _ ] = A.
[1,2,3,4,5]

可以匹配整个列表

7> [1, 2, 3, 4, 5] = A. 
[1,2,3,4,5]
% Can't skip over elements in the middle
8> [1, 2| [4, 5]] = A. 
** exception error: no match of right hand side value [1,2,3,4,5]
% This works, though not useful most of the time:
9> [1, 2, 3 | [4, 5]] = A.
[1,2,3,4,5]
% Can assign every element
10> [B, C, D, E, F] = A.
[1,2,3,4,5]
11> E.
4
12> F.
5
% If you don't use a pipe, the length has to match exactly
13> [B, C, D, E] = A.   
** exception error: no match of right hand side value [1,2,3,4,5]