我有一个功课,用于检查用户名是否有效。允许的字符为下划线,字母和数字。我不允许使用索引(!!)和长度
到目前为止,我的代码:
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
我要在isValidUsername中输入的字符串的所有字符上运行isValid函数。例如:
isValidUsername "MyUsername_123"
应该返回True
isValidUsername "not@v@lidusern@me* *2"
应该返回False
我只是想不通如何遍历字符串的所有字符。
答案 0 :(得分:4)
如果您希望所有元素满足isValid'
函数,可以使用all :: (a -> Bool) -> [a] -> Bool
函数,以便将函数重写为:
isValidUsername :: [Char] -> Bool
isValidUsername x = all isValid' x
或更短:
isValidUsername :: [Char] -> Bool
isValidUsername = all isValid'
请注意,这也意味着空字符串 ""
也是有效的用户名,因为对于空字符串,所有字符(没有字符)都在字母数字范围内
答案 1 :(得分:3)
好的,我知道了:
isValidUsername :: [Char] -> Bool
isValidUsername x
| False `elem` (map isValid x) = False
| otherwise = True