如何在 Haskell 中生成给定数字 n 的所有可能矩阵

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

我想生成一个给定数字 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]]
haskell
1个回答
0
投票

您可以与

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
元素,然后将它们组合起来。

© www.soinside.com 2019 - 2024. All rights reserved.