Я хочу написать функцию, которая принимает список и создает подмножество этого списка определенной длины на основе выходных данных функции.
Если бы меня просто интересовали первые 50 элементов отсортированного списка xs, я бы использовал fst (splitAt 50 (sort xs)).
Однако проблема в том, что элементы в моем списке зависят от других элементов втот же список.Если я выберу элемент p, тогда я ДОЛЖЕН также выбрать элементы q и r, даже если их нет в первых 50 элементах моего списка.Я использую функцию finderFunc, которая берет элемент a из списка xs и возвращает список с элементом a и всеми его необходимыми элементами.finderFunc работает отлично.Теперь задача состоит в том, чтобы написать функцию, которая создает список, общая длина которого равна 50, на основе нескольких выходных данных finderFunc.
Вот моя попытка:
finish :: [a] -> [a] -> [a]
--This is the base case, which adds nothing to the final list
finish [] fs = []
--The function is recursive, so the fs variable is necessary so that finish
-- can forward the incomplete list to itself.
finish ps fs
-- If the final list fs is too small, add elements to it
| length fs < 50 && length (fs ++ newrs) <= 50 = fs ++ finish newps newrs
-- If the length is met, then add nothing to the list and quit
| length fs >= 50 = finish [] fs
-- These guard statements are currently lacking, not the main problem
| otherwise = finish [] fs
where
--Sort the candidate list
sortedps = sort ps
--(finderFunc a) returns a list of type [a] containing a and all the
-- elements which are required to go with it. This is the interesting
-- bit. rs is also a subset of the candidate list ps.
rs = finderFunc (head sortedps)
--Remove those elements which are already in the final list, because
-- there can be overlap
newrs = filter (`notElem` fs) rs
--Remove the elements we will add to the list from the new list
-- of candidates
newps = filter (`notElem` rs) ps
Я понимаю, чтоПриведенные выше операторы if в некоторых случаях не дают мне список из точно 50 элементов.Это не главная проблема, прямо сейчас.Проблема в том, что моя функция finish не работает вообще, как я ожидал.Он не только создает дубликаты элементов в выходном списке, но иногда намного превышает общее количество элементов, которые я хочу иметь в списке.
Как это написано, я обычно называю его пустымlist, например: finish xs []
, так что список, на котором он построен, начинается как пустой список.