请求提示:如何在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))
思路提示请求
希望能得到实现该函数的思路点拨。
思路提示
- 核心需求是按顺序循环分配卡牌给玩家:玩家列表要重复使用直到所有卡牌分配完毕,
cycle函数正好能把有限列表转为无限循环的序列,比如cycle ["a","b","c"]会生成["a","b","c","a","b","c",...] - 卡牌列表和循环后的玩家列表需要一一配对,且配对顺序是(卡牌,玩家),这正是
zip函数的作用——zip xs ys会将两个列表的对应元素配对,直到其中一个列表耗尽 - 不需要写递归辅助函数,直接用
cycle处理玩家列表,再和卡牌列表做zip就能得到结果,注意参数顺序:卡牌列表在前,循环后的玩家列表在后 - 特殊情况处理:如果玩家列表是无限的(比如第三个示例的
"you":repeat "me"),cycle不会改变它,依然能正确和有限的卡牌列表配对
内容的提问来源于stack exchange,提问作者coderodde
相关产品推荐
相关产品推荐

