2013-05-06 4 views
0

Я только начал изучать Haskell.Удаление элементов списка (Haskell)

У меня есть список слов и должны

  1. удалить первые буквы всех слов, то
  2. удалить все слова, которые начинаются с буквы «а», и
  3. положить оставшиеся слова вместе.

я сумел сделать 1 и 3, но не могу понять, как удалить слова, которые начинаются с «а»

до сих пор это выглядит следующим образом:

concat(--remove words with a--(map (drop 1) ["Tree","House","Monkey","Haskell","Informatik"])) 

Спасибо Frerich Raabe , он работает

+4

'filter' и' !! 'может быть полезным. – chirlu

+2

Вместо этого '!!', вы можете предпочесть 'head'. Не забывайте - строка - это всего лишь список символов. – Steve314

+0

Вы могли бы быть более конкретным? Как отфильтровать слова с помощью? – user2355793

ответ

7

Лучше думать об этом по-другому. Вы хотите отфильтровать список, чтобы сохранить слова, которые не начинаются с 'a'. Вы можете сделать это, используя стандартную функцию filter.

filter :: (a -> Bool) -> [a] -> [a] 

Первый аргумент filter это функция, которая должна возвращать True для слов, которые вы хотите сохранить, и False для тех, которые вы хотите удалить, а второй аргумент ваш список.

filter doesNotBeginWithA (... your list goes here ...) 

Теперь вы должны реализовать эту функцию. Вы можете сделать это с помощью простого сопоставления шаблонов.

doesNotBeginWithA :: String -> Bool 
doesNotBeginWithA xs = ... 

Если вы знакомы с функцией композиции, используя not, чтобы инвертировать логику несколько более идиоматических. Кроме того, можно обобщить его немного:

filter (not . beginsWith 'a') (...) 

Теперь вы должны предоставить эту функцию вместо:

beginsWith :: Char -> String -> Bool 
beginsWith c xs = ... 
Смежные вопросы