我想生成一个给定数字 n 的列表,该列表递归地返回从 1 到
n
的所有可能组合。
例如
generate 3
应该返回:
[[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3],[1,3,1],[1,3,2],[1,3,3],[2,1,1],[2,1,2],[2,1,3],[2,2,1],[2,2,2],[2,2,3],[2,3,1],[2,3,2],[2,3,3],[3,1,1],[3,1,2],[3,1,3],[3,2,1],[3,2,2],[3,2,3],[3,3,1],[3,3,2],[3,3,3]]
逻辑上是这样的,显然会返回错误:
generate n = [replicate n _ | _ <- [1..n]]
replicateM :: Int -> m a -> m [a]
合作:
import Control.Monad(replicateM)
generate :: Int -> [[Int]]
generate = replicateM <*> enumFromTo 1
replicateM
本质上是这样的:
(\x1 x2 … xn -> [x1, x2, …, xn]) <$> fx <*> fx <*> … <*> fx
我们重复
fx
n 次。这里我们使用[1 .. n]
,所以这意味着我们从[1 .. n]
中选择一个元素,然后为[1 .. n]
选择另一个元素,依此类推,直到我们选择了n
元素,然后将它们组合起来。