Подсписки списка с использованием понимания списка

Так просто. Я хочу сгенерировать все подсписки списка, используя понимание списка.

то есть: getSublist [1,2,3] - это [[1], [2], [3], [1,2], [1,3], [2, 3], [1,2,3]]

Спасибо


person atks    schedule 01.03.2011    source источник
comment
Вы действительно хотите исключить пустой список?   -  person Tsuyoshi Ito    schedule 01.03.2011


Ответы (1)


Это уже реализовано как Data.List.subsequences, но если вы хотите определить его самостоятельно (для целей обучения), вы можете сделать это следующим образом:

Вы не можете сделать это только с помощью списков, но с некоторой рекурсией это выглядит так:

sublists [] = [[]]
sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs

Чтение: единственный подсписок пустого списка — это пустой список. Подсписки x:xs (то есть список с заголовком x и хвостом xs) — это все подсписки xs, а также каждый из подсписков xs с добавленным к ним x.

person sepp2k    schedule 01.03.2011
comment
Спасибо, это та же идея, что и у меня, но чисто рекурсивная: subList (x:xs) = (subList xs) ++ (map (\xs -> x:xs) (subList xs)) - person atks; 01.03.2011
comment
atks: обратите внимание, что вам ДЕЙСТВИТЕЛЬНО нужен базовый случай рекурсии. Дело не в том, рекурсивно это или нет, а в том, что subList то, как вы написали это здесь, определено только для непустого списка — только для одного из двух конструкторов. - person Mikael Vejdemo-Johansson; 01.03.2011
comment
Мне нравится sublists = filterM $ const [False, True] - person Tom Crockett; 01.03.2011
comment
Микаэль, спасибо за замечание, но я знал об этом. Я просто пропустил в посте, потому что размещение в комментариях ужасно. :) - person atks; 01.03.2011