Haskell 中的发牌

问题描述 投票:0回答:1

我需要定义一个函数

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

它需要像这样工作:

deal ["Hercule","Ariadne"] ["Ace","Joker","Heart"] -- Outputs [("Ace","Hercule"),("Joker","Ariadne"),("Heart","Hercule")]
take 4 (deal ["a","b","c"] (map show [0..]))       -- Outputs [("0","a"),("1","b"),("2","c"),("3","a")]
deal ("you":(repeat "me")) ["1","2","3","4"]       -- Outputs [("1","you"),("2","me"),("3","me"),("4","me")]

而且,老实说,这是一个练习;建议我使用

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))

(这甚至无法编译。)

function haskell functional-programming
1个回答
0
投票

解决方案是:

deal :: [String] -> [String] -> [(String,String)]
deal ps cs = zip cs (cycle ps)
© www.soinside.com 2019 - 2024. All rights reserved.