需要一个功能来验证密码是否牢固

时间:2019-03-28 16:59:43

标签: haskell

我需要创建一个函数来验证密码是否牢固。如果字符数超过8个,则至少1个大写字母,1个小写字母和1个数字。但是我的功能不起作用。怎么了?

forte :: String -> Bool

forte s = if (length n >= 8) && (isLower s /= 0) && (isUpper s /= 0) && (isDigit s /= 0)
          then True
          else False

1 个答案:

答案 0 :(得分:4)

欢迎来到stackoverflow。将来,当您说“不起作用”时,请具体说明。复制和粘贴错误消息是一个很好的开始。

针对您的情况,有一些问题。

  1. 没有变量n。我认为您的意思是s,就像length s一样。
  2. isLower函数对字符而不是字符串(字符列表)进行操作。您应该检查过滤列表的长度(length (filter isLower s) /= 0)。 isUpperisDigit也是如此。
  3. 偶然地,if语句是完全不需要的。每当您写if expr then True else False时,就和写expr一样。

应用这些建议,我们会得到:

forte s = (length s >= 8) && (length (filter isLower s) /= 0) && (length (filter isUpper s) /= 0) && (length (filter isDigit s) /= 0)

或具有帮助功能:

forte s = (length s >= 8) && (cnt isLower /= 0) &&
          (cnt isUpper /= 0) && (cnt isDigit /= 0)
  where cnt p = length (filter p s)

但是我可能会将其写为(输入但未经测试):

forte s = and [ length s >= 8
              , cnt isLower /= 0
              , cnt isUpper /= 0
              , cnt isDigit /= 0]
  where cnt p = length (filter p s)

编辑:啊,我不知道为什么我不考虑任何因素而不是计数元素。感谢@lorenzo

forte s = and [ length s >= 8
              , any isLower s
              , any isUpper s
              , any isDigit s]

或所有其他内容,尽管这需要您了解$的部分应用和函数组成(.):

forte s = all ($ s) [ (>= 8) . length
                    , any isLower
                    , any isUpper
                    , any isDigit ]
相关问题