#haskell #filter
#haskell #Фильтр
Вопрос:
Я пытался:
['1','2',..]
но при этом учитываются и другие символы.
Я мог бы сделать [1,2 ..] , Но для моего приложения мне нужно проверить следующее:
filter (x -> x `notElem` ['0','1'..]) "a 1 255 d e 6 g h"
Который пытается отфильтровать все элементы, включая пробелы, которые не являются натуральными числами, в данном случае ‘chars’.
Комментарии:
1. похоже, isDigit может оказаться полезным…
2. хотя
['0'..'9']
для этой цели отлично подходит или даже «длинная» форма"0123456789"
3. Можете ли вы уточнить, что вы хотите? Всего 10 цифр (от ‘0’ до ‘9’). Все, что больше этого, больше не является одним символом. На самом деле не имеет смысла говорить о «диапазоне натуральных чисел в виде символов».
4. Пожалуйста, приведите полный нетривиальный тестовый пример, каким вы хотели бы видеть результат, и каким он является в настоящее время вместо этого.
5. но вы имеете дело с ними как с символами внутри строки, а как со строками (предполагающими десятичную систему счисления) все натуральные числа представляют собой комбинации из 10 символов
'0'
через'9'
. Вот почему любая из вещей, которые я предложил в своих первых 2 комментариях, должна работать. Пожалуйста, дайте мне знать, если я неправильно понял, и вы не хотите просто отфильтровать все цифры.
Ответ №1:
Как и в комментариях, есть несколько способов:
Последовательность натуральных чисел как chars
. Также, как и в char, могут быть закодированы только числа от 0
до 9
:
naturalN :: [Char]
naturalN = ['0'..'9']
Пример:
['0'..'9']
=> "0123456789"
Что касается последовательности всех натуральных чисел, которые могут быть закодированы не как символы, а как строки. Например:
naturalN :: [String]
naturalN = map show [0..]
Пример:
take 20 naturalN
=> ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"]
Проблема с этим подходом заключается в том, что вы не можете проверить elem
or notElem
, потому что он никогда не завершит вычисление, если в случае, если условие не выполняется, поскольку это бесконечный список. Вам придется фактически использовать ограничение того, что вы ищете.
Тогда проблема в том, как вы пытаетесь попытаться отфильтровать строку, что нормально, если вы используете первый подход со списком:
filter (x -> x `elem` ['0'..'9']) "a 1 255 d e 6 g h"
=> "12556"
Или:
filter isDigit "a 1 255 d e 6 g h"
=> "12556"
В случае, если вы хотите альтернативный вариант, который заключается в удалении чисел из строки:
filter (not.isDigit) "a 1 255 d e 6 g h"
=> "a d e g h"