2015-02-23 3 views
2

Я пытаюсь решить эту проблему. Эта функция принимает два параметра. Первая функция, возвращающая логическое значение, а вторая - список чисел. Предполагается, что функция должна удалить первое значение во втором параметре, которое возвращает true при запуске с первым параметром. Существует вторая функция, которая делает то же самое, за исключением того, что она удаляет последнее значение, которое удовлетворяет ему, а не первое. Я довольно уверен, что у меня есть логика, поскольку я тестировал ее на другом языке, и это сработало, моя единственная проблема заключается в переводе ее в синтаксис Haskell. Вот что у меня есть:Удалить первое значение в списке, отвечающем критерию

removeFirst :: (t -> Bool) -> [t] -> [t] 
removeFirst p xs = [] 
removeFirst p xs 
     | p y = ys 
     | otherwise = y:removeFirst p ys 
     where 
      y:ys = xs 

removeLast :: (t -> Bool) -> [t] -> [t] 
removeLast p xs = [] 
removeLast p xs = reverse (removeFirst p (reverse xs)) 

Я побежал:

removeFirst even [1..10] 

Но вместо того, чтобы [1,3,4,5,6,7,8,9,10], как и ожидалось, я получаю []. Что я делаю неправильно?

+1

GHC должен поднять предупреждение о перекрывающихся шаблонах, если вы скомпилируете свой код с помощью '-Wall', указав на ошибку. – chi

+0

Я сделал, но я не знал, что именно это означает, но он все еще скомпилирован. – Himself12794

ответ

4
removeFirst p xs = [] 

Это всегда возвращает пустой список, и он соответствует всем аргументам. Я думаю, вы имеете в виду это.

removeFirst _ [] = [] 
+0

Спасибо! Это работает. Теперь я должен сделать то же самое, удалив второе значение. Я попытаюсь что-то предпринять, прежде чем обращаться за помощью к этому. – Himself12794

2

Ваше первое уравнение,

removeFirst p xs = [] 

говорит: «Все, что мои аргументы, просто вернуться []», а остальная часть кода игнорируется.

Вы, вероятно, означает

removeFirst p [] = [] 

говоря: «Когда список уже пуст, возвращает пустой список.»

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