Haskell中使用map实现批量计算石头剪刀布对局的evalMatch函数
问题解决
你已经实现了单局判定函数evalHand,不需要重复写判定逻辑,evalMatch的核心需求就是遍历对局列表,对每一对Hand调用evalHand即可,正确实现如下:
简洁版(高阶函数实现)
直接用map+uncurry组合现有函数即可,uncurry可以把接收两个参数的evalHand转换为接收二元组的函数,刚好匹配列表元素的格式:
evalMatch :: [(Hand, Hand)] -> [Maybe PlayerName] evalMatch = map (uncurry evalHand)
显式递归实现(如果你需要手动写递归逻辑)
如果不使用高阶函数,用常规递归写法的话如下:
evalMatch :: [(Hand, Hand)] -> [Maybe PlayerName] evalMatch [] = [] -- 空列表边界处理 evalMatch ((h1, h2):xs) = evalHand h1 h2 : evalMatch xs
原代码问题说明
- 重复实现了
evalHand已经完成的胜负判定逻辑,冗余且容易出错 map的使用不符合类型要求:evalMatch的入参是整个对局列表[(Hand, Hand)],不能作为映射函数传给map处理单个对局元素- 没有处理空列表的边界情况,第一个分支只适配了单元素列表的场景,递归分支的列表匹配逻辑也不符合类型规则
测试你给出的示例输入,两种实现都可以得到预期输出[Just "A", Just "B", Nothing]。
内容的提问来源于stack exchange,提问作者33lives
相关产品推荐
相关产品推荐

