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

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)

代码解释

  1. 获取首位数字:通过head (split idNum)拿到拆分后列表的第一个元素,也就是身份证号的首位数字,我们用where把它命名为firstDigit,让代码更清晰。
  2. 判断逻辑:
    • 如果首位数字是1或3,返回"male"
    • 如果是2或4,返回"female"
    • 其他情况抛出错误(可选,因为你说参数是11位合法身份证号,但加个错误提示能让函数更健壮)

测试示例

调用szemelyinem 40504291247时,split得到的首位数字是4,符合female的条件,所以会返回"female",完全符合你的预期!

另外,如果你想让函数更严谨,可以加上对身份证号长度的检查(确保是11位),比如在guard里先判断length (split idNum) == 11,不过这属于额外的健壮性优化,根据你的需求来就好。

内容的提问来源于stack exchange,提问作者hnrc.akos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:33:11