You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell函数调用问题:邮箱本地部分校验输出不符合预期

Haskell邮箱本地部分校验问题修正

问题点梳理

你的代码主要存在以下几个问题,导致无法得到预期结果:

  1. localPart核心逻辑错误:
    • 第一个守卫未加入repeatedLocal返回False的判断,不符合你设定的全部校验条件;
    • 第二个守卫条件写反——当前逻辑是repeatedLocal为False时返回无效,和你预期的逻辑完全相反;
    • 第三个守卫递归调用localPart xs完全不合理,邮箱本地部分是完整字符串,不需要拆开头字符反复判断。
  2. 辅助函数冗余/逻辑偏差:
    • lowerCase里的if then else完全多余,直接返回all isLower x即可;
    • num函数可以用any isDigit替代手动写数字列表,更简洁且不易出错;
    • 原repeatedLocal的逻辑是检查某个.或_在后续字符中再次出现(非连续重复也会被判无效),如果你的需求是禁止连续重复的.或_,这个逻辑就不符合要求。

修正后的代码

import Data.Char(isLower, isDigit)

-- 校验字符串不含指定特殊字符
charact :: String -> Bool
charact = not . any (`elem` "! #$%&'*+-/<>?^`{|}:,``[]];") -- 注意:此处包含空格,无需校验可移除

-- 检查是否存在连续重复的'.'或'_'(符合常见邮箱规则:a..b无效,a.b.c有效)
repeatedLocal :: String -> Bool
repeatedLocal [] = False
repeatedLocal [_] = False
repeatedLocal (x:y:xs)
  | x == y && x `elem` "._" = True
  | otherwise = repeatedLocal (y:xs)

-- 校验字符串全为小写
lowerCase :: String -> Bool
lowerCase = all isLower

-- 校验字符串包含数字
num :: String -> Bool
num = any isDigit

-- 判断邮箱本地部分是否有效
localPart :: String -> String
localPart s
  | length s <= 24 && charact s && lowerCase s && num s && not (repeatedLocal s) = "E-mail Valido"
  | otherwise = "E-mail Invalido"

关键修正说明

  • localPart逻辑重构:直接基于完整字符串判断,将你预期的所有校验条件(长度≤24、charact为真、lowerCase为真、num为真、repeatedLocal为假)合并到一个守卫中,不满足则直接返回无效;
  • repeatedLocal调整:改为检查连续重复的.或_,更贴合实际邮箱校验规则;若你确实需要禁止出现多个.或_(无论是否连续),换回原repeatedLocal逻辑即可;
  • 辅助函数简化:移除冗余判断,使用Haskell内置字符判断函数让代码更简洁可靠。

内容的提问来源于stack exchange,提问作者Sengeki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:45:29