Я новичок в переполнении стека и Haskell, поэтому, пожалуйста, дайте мне знать, если есть другой способ сделать это!
Это очень похоже на повторение этого вопроса переполнения стека, Подмножества рекурсии Haskell , но ответ на этот вопрос мне не очень помог, и я все еще не понимаю, как работает рекурсия в этой проблеме.Это моя попытка возобновить разговор по этому вопросу.
Вот вопрос:
Я не понимаю, как работает рекурсия в следующем коде:
subsets :: [a] -> [[a]]
subsets [] = [[]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]
Вывод этого кода:
*Main> subsets [1,2,3]
[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
Я понимаю, как подмножества вызываются рекурсивно и как вы можете добраться до подмножества [] = [[]]
, но я не совсем понимаю, как это возвращает список списков и как он возвращает некоторый список, такой как [1]
, [1,3]
и [2,3]
.
Опять же, я новичок в переполнении стека, поэтому, пожалуйста, дайте мне знать, если есть лучший способ сделать это, кроме повторения вопроса.