2017-03-23 7 views
0

Erlangでは、n個の要素を含むリストのx-n番目の要素をフェッチしたいと思います。私はlists:nth/2を使用することができますが、x> nの場合はこのエラーが発生し、デフォルト値(この場合は[])を取得したいと考えています。リスト要素のフェッチ

リストの長さを確認することなくこれを行う組み込みの方法はありますか?

+0

この動作を実装する独自の関数を作成することをお勧めします。 –

+1

残念ながら、これを行う可能性のあるBIFまたはNIFはありません。あなたの最善の策は、長さをチェックするガード付きの小さなラッパー関数を書くことです。 – matov

+0

私が研究できる限り、@matovがここにあるように見えます。私はこれを閉じることができるように答えとして投稿できますか? –

答えて

0

{error,[]} = N(500,[a]).間の違いを確認するためにタグ付けされた戻り値を使用して、あなたのためにこれを行う可能性がありますBIFまたはNIFありません。あなたの最善の策は、長さをチェックするガード付きの小さなラッパー関数を書くことです。次のようなものがあります。

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

ガードで 'length(L)'を使用することについての私の唯一の懸念は 'length'が長さを決定するためにリスト全体を走査しなければならないということです。あなたが望むものすべてが最初の要素であっても、リストが長い場合にはこれには時間がかかることがあります。私のラップトップには 'tc(erlang、length、[Short])というタイマーがあります。例えば、' Short = lists:seq(1,10).'と 'Long = lists:seq(1,10000000) 。 => {4,10} 'と' timer:tc(erlang、length、[Long])です。 => {17085,10000000} ' – GuessBurger

1
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> 

が、私は残念ながらない{ok,[]} = N(2,[a,[],b]).