Erlang 列表元素获取

Erlang 列表元素获取,erlang,Erlang,在Erlang中,我想获取包含n个元素的列表的第x-n个元素。我可以使用列表:nth/2,但是当x>n时,这个列表会抛出一个错误,我希望得到一个默认值([],在这种情况下) 有没有一种不必检查列表长度的内置方法可以做到这一点?1>N=fun(Pos,list)-> 1> N = fun(Pos,List) -> 1> try 1> {ok,lists:nth(Pos,List)} 1> catch

在Erlang中,我想获取包含n个元素的列表的第x-n个元素。我可以使用
列表:nth/2
,但是当x>n时,这个列表会抛出一个错误,我希望得到一个默认值(
[]
,在这种情况下)

有没有一种不必检查列表长度的内置方法可以做到这一点?

1>N=fun(Pos,list)->
1> N = fun(Pos,List) ->
1>     try                 
1>         {ok,lists:nth(Pos,List)}
1>     catch                   
1>         _:_ -> {error,[]}       
1>     end                     
1> end.
#Fun<erl_eval.12.52032458>
2> N(2,[1,2,3,4]).         
{ok,2}
3> N(5,[1,2,3,4]).         
{error,[]}
4>
1> 试一试 1> {好的,列表:n(Pos,List)} 1> 抓住 1> {错误,[]} 1> 结束 1> 结束。 #乐趣 2> N(2,[1,2,3,4])。 {好的,2} 3> N(5,[1,2,3,4])。 {错误,[]} 4>

我使用带标记的返回值来区分
{ok,[]}=N(2,[a,[],b])。
{error,[]}=N(500,[a])。

不幸的是,没有BIF或NIF可以为您做到这一点。最好的办法是编写一个带有保护的小包装函数来检查长度。比如:

F = fun (N, L) when N > length(L) -> [];
        (N, L) -> lists:nth(N,L) end.

我建议您构建自己的函数来实现这种行为。不幸的是,没有BIF或NIF可以为您做到这一点。你最好的办法是写一个带保护的小包装函数来检查长度。据我所知,@matov就在这里。你能把它作为一个答案贴出来吗?AsierAzkuenaga谢谢,贴出了我的答案我唯一关心的是在警卫中使用
length(L)
,因为
length
必须遍历整个列表才能确定长度。如果列表很长,这可能需要一些时间,即使您只需要第一个元素。例如,
Short=lists:seq(1,10)。
Long=lists:seq(110000000)。
在我的笔记本电脑上,我有以下
计时器:tc(erlang,length,[Short])。=>{4,10}
计时器:tc(erlang,length,[Long])=>{1708510000000}