#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)