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

请求提示:如何在Haskell中实现deal发牌函数

问题:实现Haskell的deal函数

函数签名

需要定义的函数类型如下:

deal :: [String] -> [String] -> [(String,String)]

预期行为示例

该函数需满足以下运行结果:

-- 输出 [("Ace","Hercule"),("Joker","Ariadne"),("Heart","Hercule")]
deal ["Hercule","Ariadne"] ["Ace","Joker","Heart"]

-- 输出 [("0","a"),("1","b"),("2","c"),("3","a")]
take 4 (deal ["a","b","c"] (map show [0..]))

-- 输出 [("1","you"),("2","me"),("3","me"),("4","me")]
deal ("you":(repeat "me")) ["1","2","3","4"]

实现建议

题目提示使用zip和cycle函数来完成。

我的尝试(无法编译)

我已经花了三个半小时尝试,但还没找到解决方案,目前写的代码如下:

deal :: [String] -> [String] -> [(String, String)]
deal ps cs = dealHelper ps cs ps cs []
  where dealHelper [] [] _ _ result = result
        dealHelper ps [] _ _ result = dealHelper ps (take (length ps) cs) result
        dealHelper [] cs allps allcs result = dealHelper (take (length cs))

思路提示请求

希望能得到实现该函数的思路点拨。


思路提示

  1. 核心需求是按顺序循环分配卡牌给玩家:玩家列表要重复使用直到所有卡牌分配完毕,cycle函数正好能把有限列表转为无限循环的序列,比如cycle ["a","b","c"]会生成["a","b","c","a","b","c",...]
  2. 卡牌列表和循环后的玩家列表需要一一配对,且配对顺序是(卡牌,玩家),这正是zip函数的作用——zip xs ys会将两个列表的对应元素配对,直到其中一个列表耗尽
  3. 不需要写递归辅助函数,直接用cycle处理玩家列表,再和卡牌列表做zip就能得到结果,注意参数顺序:卡牌列表在前,循环后的玩家列表在后
  4. 特殊情况处理:如果玩家列表是无限的(比如第三个示例的"you":repeat "me"),cycle不会改变它,依然能正确和有限的卡牌列表配对

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:10:22