3

Haskellでリストのリストを拡張できる方法はありますか?

[1,2,2,3,3,3,4,4,4,4.....] を生成する関数を作成しようとしていますが、これは基本的に 1 1、2 2、3 3 などです。

私の試み:

nnss :: [Integer]
nnss = [nPrint x x | x <- [1,2..]]

私の試みの問題は、nPrint x x整数のリストを返すことです。たとえば、nPrint 2 2 は [2, 2] を返します。[1,2,3...] から [1,2,2,3,3,3...] にリストを「拡張」できる方法はありますか?

4

3 に答える 3

8

探している関数シグネチャは であり、 hoogle[[a]] -> [a]チェックすると、それが探しているものであることがわかります。concat

ただし、この場合、各項目を反復処理しているだけなので、リスト内包表記は不要ですmapmapと の組み合わせconcatは非常に一般的なので、次のように書くことができます。

concatMap (\x -> nPrint x x) [1..]

Haskell を初めて使用する場合は、これを無視できますが、リスト モナドが定義されているため、次のconcatMapように書くこともできます。

[1..] >>= \x -> nPrint x x
于 2013-04-01T15:08:22.520 に答える
1

マップとリストの連結を使用せずに書くこともできます (一定時間前に追加するだけです)。

nnss :: [Integer]
nnss = genRepeated 1 1

genRepeated :: Integer -> Integer -> [Integer]
genRepeated x 0 = genRepeated (x+1) (x+1)
genRepeated x y = x : genRepeated x (y-1)

よりも

take 22 nnss == [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7]

他の高速な可能性は次のとおりです。

nnss :: [Integer]
nnss = flatten [take x $ repeat x | x <- [1..]]

flatten :: [[a]] -> [a]
flatten [] = []
flatten ([]:xs) = flatten xs
flatten ((x:xs):ys) = x : flatten (xs:ys)
于 2013-04-01T16:42:13.310 に答える