如何在Haskell中检查字符串的每个字符

时间:2018-10-07 14:10:30

标签: string list haskell char

我有一个功课,用于检查用户名是否有效。允许的字符为下划线,字母和数字。我不允许使用索引(!!)和长度

到目前为止,我的代码:

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

我只是想不通如何遍历字符串的所有字符。

2 个答案:

答案 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