2010-12-15 4 views
1

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

т.е.

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

Можно построить самостоятельно, но интересуется, если эта проблема была решена, прежде чем где-нибудь?

+0

Нет, но это должно быть достаточно легко писать. Похоже на работу для списков: unfold/4 - к сожалению, пока этого не существует. – dsmith 2010-12-16 01:00:52

ответ

2

Я предполагаю, что ваш тест забывает [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. 
+0

Конечно, делает работу, спасибо! (и да, я пропустил [1,3,4] - теперь добавил к вопросу). Я собираюсь уйти и подумать о хвостовой рекурсивной версии. – majelbstoat 2010-12-16 04:22:27