Замените ваш фильтр на понимание списка.
[x | x <- replaceStr str " " "_", x /= '_', Char.isAplhaNum x]
Естественно, вы, вероятно, хотите иметь несколько исключений. Итак, определите вспомогательную функцию:
notIn :: (Eq a) => [a] -> a -> Bool
notIn [] _ = True
notIn x:xs y = if x == y
then False
else notIn xs
РЕДАКТИРОВАТЬ: Очевидно, вы можете использовать notElem :: (Eq a) => a -> [a] -> Bool
вместо. Оставляя вышеуказанный код для образовательных целей.
И используйте это в своем понимании списка:
[x | x <- replaceStr str " " "_", notElem x "chars to reject", Char.isAlphaNum x]
Не проверено, поскольку haskell не установлен на этом компьютере. Бонусные баллы, если вы делаете карту после фильтра, так как вы можете поместить это в понимание списка.
Редактировать 2: Попробуйте это вместо этого, я пошел по вашим стопам, вместо того, чтобы думать сам:
[x | x <- replaceStr str " " "_", Char.isAlphaNum x || x == ' ']
[x | x <- replaceStr str " " "_", Char.isAlphaNum x || x `elem` "chars to accept"]
На данный момент понимание списка мало помогает. Единственная причина, по которой я это изменил, заключалась в том, что я попросил у вас &&
, для которого отлично подходит использование списка.
Так как кажется, что вы не совсем понимаете принцип понимания списка, он в основном применяет набор фильтров, а затем карту с более чем одним источником, например:
[(x, y, x + y) | x <- [1, 2, 3, 4, 5], y <- [2, 4], x > y]