Haskell:返回[1..n]中n个元素列表的列表

Scr*_*tim 1 algorithm haskell

我需要一个功能f :: (Integral n) => n -> [[n]].

返回的列表应包含n所有元素源自的所有长度列表[1..n].

例:

f 2 = [[1,1],[1,2],[2,1],[2,2]]
Run Code Online (Sandbox Code Playgroud)

对于常数ns来说这是一个简单的问题:

f2 = [[a, b] | a <- [1..2], b <- [1..2]]
f3 = [[a, b, c] | a <- [1..3], b <- [1..3], c <- [1..3]]
f4 = [[a, b, c, d] | a <- [1..4], b <- [1..4], c <- [1..4], d <- [1..4]]
Run Code Online (Sandbox Code Playgroud)

kar*_*kfa 7

一个解决方案可以

f n = sequence . replicate n $ [1..n]
Run Code Online (Sandbox Code Playgroud)

请注意,f 10将有10 ^ 10个元素

  • 你可以使用`enumFromTo`来避免重复对'n`的引用,从而得到一个无点版本`f = sequence.(复制<*> enumFromTo 1)`. (3认同)

גלע*_*רקן 6

另一种方法可能是:

Prelude> import Control.Monad
Prelude Control.Monad> f n = replicateM n [1..n]
Prelude Control.Monad> f 2
[[1,1],[1,2],[2,1],[2,2]]
Run Code Online (Sandbox Code Playgroud)

  • 来自@ chepner的评论,来自`replicateM <*>(enumFromTo 1)的免费评论 (2认同)