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

理解Haskell数据类型与构造器 解决井字棋行获胜判断函数问题

你的代码存在以下几个问题:
  • 返回值类型不匹配:函数声明的返回类型是Maybe Player,但你第二个守卫分支返回的是Just (head c),head c的类型是Cell(P X、P O都属于Cell类型,不是Player类型),编译阶段就会报错。你需要把Cell中包裹的Player值提取出来再返回。
  • 空列表处理不安全:你直接调用head c,如果输入的行是空列表,head会直接抛出运行时错误,哪怕井字棋场景下不会出现空行,代码也要保证语法层面的鲁棒性。
  • 首个守卫逻辑冗余:你写的head c == E && all (== head c) c才返回Nothing,但实际上只要行首为E,不管剩余元素是什么,这一行都不可能全为同一玩家的标记,直接返回Nothing即可,不需要额外判断全行为空。
  • 判断逻辑冗余:不需要单独判断head c == P X || head c == P O,用模式匹配可以直接提取出Player值,代码更简洁。
修正后的参考代码
whoWonOnRow :: [Cell] -> Maybe Player
whoWonOnRow [] = Nothing
whoWonOnRow (E:_) = Nothing
whoWonOnRow (P p:rest) = if all (== P p) rest then Just p else Nothing

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:04