Haskell中如何对字符列表元素应用函数?字符串验证报错求助
解决Haskell标识符验证的类型错误问题
嘿,我一眼就瞅到你代码里的问题啦!先给你拆解下错误根源,再给你修正后的完整代码。
错误原因拆解
你收到的类型错误,核心是参数类型不匹配,还有个小逻辑漏洞:
isIdentifierPart函数的参数是单个Char,但你在isValid里直接把xs(这是个[Char]字符串)传进去了,Haskell自然会报错:“我要单个字符,你给我一串字符干啥?”- 另外,你用
isReserved [x]是在检查第一个字符组成的单字符字符串是不是保留字,但实际上你应该检查整个输入的完整字符串才对。
修正方案
要搞定这两个问题,我们需要:
- 用
all函数遍历xs的每个字符,确保它们都满足isIdentifierPart条件——all isIdentifierPart xs会逐个检查列表元素,只有所有元素都符合规则才返回True。 - 把
isReserved [x]改成isReserved (x:xs),这样就能检查整个输入字符串是不是保留字了。 - 补充空字符串的处理:空字符串肯定不是合法标识符,所以要加
isValid "" = False。
修正后的完整代码
import Data.Char listLower = ['a'..'z'] listUpper = ['A'..'Z'] listNum = ['0'..'9'] listRes = ["if","then","else","module","import"] isIdentifierStart :: Char -> Bool isIdentifierStart x = x `elem` listLower isIdentifierStart _ = False isIdentifierPart :: Char -> Bool isIdentifierPart x = x `elem` listLower || x `elem` listUpper || x `elem` listNum isIdentifierPart _ = False isReserved :: String -> Bool isReserved x = x `elem` listRes isReserved _ = False isValid :: String -> Bool isValid "" = False -- 处理空字符串的边界情况 isValid (x:xs) = isIdentifierStart x && all isIdentifierPart xs && not (isReserved (x:xs))
可选小优化
其实你可以用 Data.Char 自带的函数简化代码,不用自己定义字符列表:
isIdentifierStart x = isLower xisIdentifierPart x = isLower x || isUpper x || isDigit x
这样代码会更简洁易读哦~
内容的提问来源于stack exchange,提问作者vNSkyline
相关产品推荐
相关产品推荐

