我需要创建一个函数来验证密码是否牢固。如果字符数超过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
答案 0 :(得分:4)
欢迎来到stackoverflow。将来,当您说“不起作用”时,请具体说明。复制和粘贴错误消息是一个很好的开始。
针对您的情况,有一些问题。
n
。我认为您的意思是s
,就像length s
一样。isLower
函数对字符而不是字符串(字符列表)进行操作。您应该检查过滤列表的长度(length (filter isLower s) /= 0
)。 isUpper
和isDigit
也是如此。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 ]