Как проверить каждый символ строки в Haskell - PullRequest
0 голосов
/ 07 октября 2018

У меня есть домашняя работа для функции, которая проверяет, является ли имя пользователя действительным или нет.Разрешенные символы - это подчеркивание, буквы и цифры.Мне не разрешено использовать индексирование (!!) и длину

Мой код:

isValid' :: Char -> Bool
isValid' x
     | x == '_'    = True
     | x `elem` ['0'..'9'] = True
     | x `elem` ['a'..'z'] = True
     | x `elem` ['A'..'Z'] = True
     | otherwise           = False

isValidUsername :: [Char] -> Bool
isValidUsername x
     | map isValid' x = True
     | otherwise     = False

Я хочу запустить функцию isValid на всех символах строки, которую я вставил вisValidUsername.Например:

isValidUsername "MyUsername_123" должен возвращать True

isValidUsername "not@v@lidusern@me* *2" должен возвращать False

Я просто не могу понять, как пройти через все символы моей строки.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Хорошо, если вы хотите, чтобы все элементы удовлетворяли функции isValid', вы можете использовать функцию all :: (a -> Bool) -> [a] -> Bool, чтобы вы могли переписатьфункция для:

isValidUsername :: [Char] -> Bool
isValidUsername x = all isValid' x

или даже короче:

isValidUsername :: [Char] -> Bool
isValidUsername = all isValid'

Обратите внимание, что здесь это означает, что пустая строка "" также является допустимым именем пользователя,поскольку для пустой строки все символы (без символов) находятся в буквенно-цифровом диапазоне.

0 голосов
/ 07 октября 2018

Хорошо, я понял:

isValidUsername :: [Char] -> Bool
isValidUsername x
     | False `elem` (map isValid x) = False
     | otherwise                    = True
...