2014-02-27 2 views
0

Как удалить элемент из списка в Haskell? У меня есть этот код, но он не работает. Понятие его, у меня есть 2 списка, у aList всегда будет только один элемент. bList всегда будет иметь элемент, который находится в aList. Поэтому я хочу удалить элемент из bList и в конце, вывести новый список без этого элемента. Могли бы дать некоторые подсказки, пожалуйста? БлагодаряУдалить элемент из списка в Haskell

removeFromList :: aList -> bList -> finalList 
removeFromList [] _   = [] 
removeFromList (y:ys) (x:xs) 
        | y == x = removeFromDatabase y xs 
        | otherwise = y : removeFromDatabase y xs 
+0

'удалить xs ys = [y | y <- ys, not (y 'elem' xs)] ' – josejuan

ответ

1
removeFromList :: Eq a => [a] -> [a] -> [a] 
removeFromList _ []   = [] 
removeFromList (y:ys) (x:xs) 
        | y == x = removeFromList [y] xs 
        | otherwise = x : removeFromList [y] xs 

Там несколько вопросов:

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

removeFromList _ [] = [] 

Во-вторых, вам нужно обновить список, содержащий один элемент при создании рекурсивные вызовы, т.е. removeFromList [y] xs

В-третьих типы списка должны быть одинаковыми, и вам потребуется Eq ограничение для ==

+0

Вы можете использовать' ys @ (y: _) '; 'removeFromList ys' вместо того, чтобы каждый раз создавать новый список. – Yuuri

1

Пока вы всегда есть один элемент в aList, я бы предложил другое решение:

removeFromList :: Eq a => [a] -> [a] -> [a] 
removeFromList [elem] = filter (== elem) 

Или, если у вас есть только один вхождение этого элемента:

import Data.List 
removeFromList [elem] = delete elem 

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

Проблемы в коде:

  • используется aList и bList не в качестве имен аргументов, но как переменные типа в сигнатуре функции, которые являются слишком общими (эквивалент removeFromList :: a -> b -> c)
  • Когда вы рекурсивный вызов функция, вы передаете y, который является единственным элементом, а не списком.
+0

Aaaaand Я могу отказаться от проекта. Еще раз. +1, хотя я бы предложил оставить список вокруг аргумента ('rfl :: Eq a => a -> [a] -> [a]') по причинам, которые вы уже дали. – Zeta

+0

Согласен, но вопросник должен был указать первый аргумент как список - возможно, эта функция уже используется где-то. Или, возможно, у них было неправильное заявление с самого начала :) – Yuuri

Смежные вопросы