直言不讳,我对Haskell还是陌生的,她试图解决一个问题(编程练习)。它说我应该创建一个函数
com :: Int -> [t] -> [[t]]
返回n个元素的所有可能选择,其中n和list分别是第一个和第二个参数。可以再次以不同的顺序拾取元素。结果将是:
com 2 [1,2,3] = [[1,1], [1,2]..[3,3]]
对于n = 1和n = 2的情况,我设法解决了这些情况。 n = 1的情况非常简单,对于n = 2的情况,我将使用串联并进行构建。但是,我不知道如何将其制成n元并为所有n工作。就像突然之间函数调用就像
com 10
... 最佳答案
这是你想要的吗?
> sequence (replicate 3 "abc")
["aaa","aab","aac","aba","abb","abc","aca","acb","acc"
,"baa","bab","bac","bba","bbb","bbc","bca","bcb","bcc"
,"caa","cab","cac","cba","cbb","cbc","cca","ccb","ccc"]
上面利用了以下事实:列表monad中的
sequence
构建列表列表的笛卡尔积。因此,我们可以简单地复制列表n
次,然后获取产品。(请注意,上面的
"abc"
是字符['a','b','c']
的简写形式)因此,一个解决方案可能是
com n xs = sequence (replicate n xs)
或等效地,正如Daniel Wagner在下面指出的那样,
com = replicateM
最后一点:我确实意识到这可能对实际学习编程没有太大帮助。实际上,我从库中提取了两个“魔术”函数来解决任务。它仍然显示了如何将问题减少为两个子问题:1)复制值
n
次和2)构建笛卡尔积。如果您不想使用该库,则第二个任务本身就是一个不错的练习。您不妨从以下方面解决问题:sequence :: [[a]] -> [[a]]
sequence [] = [[]]
sequence (x:xs) = ...
where ys = sequence xs