Haskell新手求助:实现身份证号性别判断函数szemelyinem
解决你的Haskell身份证性别判断函数问题
嘿,作为Haskell新手能想到拆分数字再判断的思路已经很棒啦!你的方向完全正确,咱们一步步把这个szemelyinem函数实现出来。
首先,先确认你已经定义的split函数是没问题的——它会把输入的整数从高位到低位拆成列表,比如输入40504291247,split之后会得到[4,0,5,0,4,2,9,1,2,4,7],正好能拿到我们需要的首位数字。
接下来,咱们就基于这个split函数来实现目标函数:
方法一:用case表达式实现
-- 先声明函数类型(建议养成好习惯) szemelyinem :: Integral x => x -> String szemelyinem idNum = case head (split idNum) of 1 -> "male" 3 -> "male" 2 -> "female" 4 -> "female" _ -> error "Invalid ID number: first digit must be 1,2,3 or 4"
方法二:用guard守卫实现(可读性更强)
szemelyinem :: Integral x => x -> String szemelyinem idNum | firstDigit `elem` [1, 3] = "male" | firstDigit `elem` [2, 4] = "female" | otherwise = error "Invalid ID number: first digit is not valid" where firstDigit = head (split idNum)
代码解释
- 获取首位数字:通过
head (split idNum)拿到拆分后列表的第一个元素,也就是身份证号的首位数字,我们用where把它命名为firstDigit,让代码更清晰。 - 判断逻辑:
- 如果首位数字是1或3,返回
"male" - 如果是2或4,返回
"female" - 其他情况抛出错误(可选,因为你说参数是11位合法身份证号,但加个错误提示能让函数更健壮)
- 如果首位数字是1或3,返回
测试示例
调用szemelyinem 40504291247时,split得到的首位数字是4,符合female的条件,所以会返回"female",完全符合你的预期!
另外,如果你想让函数更严谨,可以加上对身份证号长度的检查(确保是11位),比如在guard里先判断length (split idNum) == 11,不过这属于额外的健壮性优化,根据你的需求来就好。
内容的提问来源于stack exchange,提问作者hnrc.akos
相关产品推荐
相关产品推荐

