直言不讳,我对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

10-06 06:18