我可以理解我在文档中阅读的大多数[H|T]
示例。我通常意味着我想使用列表中的H
或T
部分。如果我想改用整个列表怎么办?示例代码:
-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)
帮助表示赞赏。
答案 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]