Разделить список Эрланга, X, на список всех подсписков X - PullRequest
1 голос
/ 16 декабря 2010

lists:sublist/2 и lists:sublist/3 упрощают извлечение одного подсписка из списка, но есть ли BiF или модуль, который возвращает список всех подсписков списка?

т.е.

lists:awesome_sublist_function([1,2,3,4]) ->
  [[1], [2], [3], [4], [1,2], [1,3], [1,4], 
  [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4], [2,3,4], [1,2,3,4]]

Могу построить свой, но задумался, была ли проблема решена раньше где-нибудь?

1 Ответ

2 голосов
/ 16 декабря 2010

Полагаю, ваш тестовый пример забыл [1,3,4], но он может выглядеть примерно так:

-module(settheory).
-export([combinations/1]).

combinations([]) ->
    [];
combinations([H | T]) ->
    CT = combinations(T),
    [[H]] ++ [[H | L] || L <- CT] ++ CT.

-include_lib("eunit/include/eunit.hrl").
combinations_test() ->
    ?assertEqual(
       combinations([1,2,3,4]),
       lists:sort([[1], [2], [3], [4], [1,2], [1,3], [1,4],
                   [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4],
                   [2,3,4], [1,2,3,4]])),
    ok.
...