не могу заставить мою функцию рекурсии работать со списком

#haskell

#haskell

Вопрос:

Передаю список, такой как: [1,2,3,4,5] и возвращаюсь [ [1,2,3,4,5] , [2,3,4,5] , [3,4,5] , [4,5] , [5] , [] ]

мой подход заключается в использовании рекурсии для добавления drop 1 list в другой пустой список, пока список не станет пустым. но, похоже, я не могу заставить мою рекурсию работать правильно.

помогите, пожалуйста, спасибо

мой код до сих пор:

 test a = test2 a where
test2 a | size(a) > 1 = test (drop 1 a):[]
        | otherwise = []
  

но это не сработало бы, потому что рекурсия возвращает список в список, а не список. Я просто не могу понять, как вы можете назначить его чему-то и вернуть его одновременно.

Комментарии:

1. Где код? Мы не можем сказать вам, что вы делаете неправильно, если мы не видим, что вы сделали в первую очередь

2. Я не знаю haskell, поэтому могу ошибаться, но я думаю, вам нужно проверить случай, когда вы хотите распечатать исходный список.

Ответ №1:

Прежде всего, для чего вы это сделали test a = test2 a ?

Тогда вам не нужны (и не должны использовать) для этого средства защиты, сделайте это с помощью сопоставления с образцом:

 test [] = [[]]
test (a:al) = (a:al):(test al)
  

Если вы настаиваете на использовании guards, вам все равно нужно сделать это списком списков:

 test a
  | null a    = [[]]
  | otherwise = a:(test $ tail a)
  

(Не список списков списков, как у меня было в моем первоначальном сообщении …)

Комментарии:

1. Я пробовал другой подход с вспомогательной функцией, думаю, в этом случае она мне не нужна. Спасибо!

2. Эта последняя строка должна быть a : (test (tail a)) — обратите внимание, что список ввода a не должен быть инкапсулирован как новый одноэлементный список.

Ответ №2:

Функция, которую вы описываете, уже есть в стандартной библиотеке, где она вызывается Data.List.tails . Вы можете взглянуть на его исходный код, чтобы увидеть, как это работает.

Ответ №3:

Если вы хотите придерживаться своего drop 1 подхода, вы могли бы написать

 test xs = take (1   length xs) $ iterate (drop 1) xs
  

Немного забавная версия

 import Data.List

test = (  [[]]) . transpose . zipWith replicate [1..]
  

Ответ №4:

 fromNet [] = [[]]
fromNet lst =  lst : fromNet (tail lst)