12

Armstrong の「Programming Erlang」で Erlang を紹介しています。演習の 1 つは、tuple_to_list/1 BIF の再実装を作成することです。特にヘルパー関数を使用しているため、私のソリューションはかなり洗練されていないように思えます。これを行うためのより Erlang っぽい方法はありますか?

tup2lis({}) -> [];
tup2lis(T) -> tup2list_help(T,1,tuple_size(T)).

tup2list_help(T,Size,Size) -> [element(Size,T)];
tup2list_help(T,Pos,Size) -> [element(Pos,T)|tup2list_help(T,Pos+1,Size)].

アイデアをありがとうございました。:)

4

7 に答える 7

19

あなたの機能は大丈夫だと思います。あなたの目標が言語を学ぶことであれば、それ以上です。スタイルの問題として、通常、リストを構築するときの基本ケースは空のリスト [] です。だから私は書くだろう

tup2list(Tuple) -> tup2list(Tuple, 1, tuple_size(Tuple)).

tup2list(Tuple, Pos, Size) when Pos =< Size ->  
    [element(Pos,Tuple) | tup2list(Tuple, Pos+1, Size)];
tup2list(_Tuple,_Pos,_Size) -> [].

リスト内包表記でほとんど同じように書くことができます

[element(I,Tuple) || I <- lists:seq(1,tuple_size(Tuple))].

lists:seq(1,0) は空のリストを与えるため、タプルに要素がない場合は期待どおりに機能します。

于 2013-04-25T19:08:15.470 に答える
8

あなたのコードは優れており、この種のものを作成する方法も慣用的です。このリストを後方に構築することもできます。この場合、テール コールのために少し速くなりますが、重要ではありません。

tup2list(T) -> tup2list(T, size(T), []).

tup2list(T, 0, Acc) -> Acc;
tup2list(T, N, Acc) -> tup2list(T, N-1, [element(N,T)|Acc]).
于 2013-04-25T21:02:25.720 に答える
3

私はジョー・アームストロングの本からエクササイズを試みています。これが私が思いついたものです

my_tuple_to_list(Tuple) -> [element(T, Tuple) || T <- lists:seq(1, tuple_size(Tuple))].
于 2015-01-05T23:02:55.067 に答える
2

Erlang R16B では、次のようにerlang:delete_element/2関数を使用することもできます。

tuple2list({}) -> [];
tuple2list(T) when is_tuple(T) ->
    [element(1, T) | tuple2list(erlang:delete_element(1, T))].
于 2013-04-25T21:53:44.507 に答える
0

mytuple_to_list(T) when tuple_size(T) =:= 0 -> []; mytuple_to_list(T) -> [element(1, T)|mytuple_to_list(erlang:delete_element(1, T))].

于 2014-11-17T16:25:27.033 に答える
0

Erlang 17.0 では、自然な順序でリストを作成する必要があります。上記のソリューションは効率の観点から正しくありません。常に既存のリストの先頭に要素を追加します。

%% ====================================================================
%% API functions
%% ====================================================================
my_tuple_to_list({}) ->
    [];
my_tuple_to_list(Tuple) ->
   tuple_to_list_iter(1, size(Tuple), Tuple, [])
.
%% ====================================================================
%% Internal functions
%% ====================================================================
tuple_to_list_iter(N, N, Tuple, List) ->
    lists:reverse([element(N, Tuple)|List]);

tuple_to_list_iter(N, Tuplesize, Tuple, List) ->
    L = [element(N, Tuple)|List],
    tuple_to_list_iter(N + 1, Tuplesize, Tuple, L)    
.
于 2014-06-21T15:14:13.343 に答える