理解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
相关产品推荐
相关产品推荐

