【问题标题】:How to check for each char of a string in Haskell如何在 Haskell 中检查字符串的每个字符
【发布时间】:2019-03-12 08:37:23
【问题描述】:

我有一个检查用户名是否有效的函数的作业。允许的字符是下划线、字母和数字。我不允许使用索引 (!!) 和 Length

到目前为止我的代码:

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

我只是不知道如何遍历字符串的所有字符。

【问题讨论】:

  • "对字符串的所有个字符运行我的 isValid 函数" --> all
  • 作为风格建议,您不必写f .. | condition = True ; | otherwise = False。你的 condition 已经被评估为想要的布尔值,所以你可以简单地写 f .. = condition,没有警卫。

标签: string list haskell char


【解决方案1】:

如果你想让所有元素满足isValid'函数,你可以使用all :: (a -> Bool) -> [a] -> Bool函数,所以你可以重写你的函数:

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

甚至更短:

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

请注意,这意味着 空字符串 "" 也是有效的用户名,因为对于空字符串,所有字符(没有字符)都在字母数字范围内。

【讨论】:

    【解决方案2】:

    好的,我想通了:

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

    【讨论】:

    • 每当您的某个函数显式返回 TrueFalse 时,它都可以(可能)被简化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多