扩展Haskell中的列表列表

rlh*_*lhh 3 haskell list-comprehension list

无论如何,我可以在Haskell中扩展列表列表吗?

我正在尝试编写一个生成[1,2,2,3,3,3,4,4,4,4 .....]的函数,它基本上是1个,2个,2个,3个等等.

我的尝试:

nnss :: [Integer]
nnss = [nPrint x x | x <- [1,2..]]
Run Code Online (Sandbox Code Playgroud)

我尝试的问题是nPrint x x返回一个整数列表,例如,nPrint 2 2将返回[2,2].无论如何,我可以将列表从[1,2,3 ...]"扩展"到[1,2,2,3,3,3 ...]?

Dan*_*zer 8

我们正在寻找的功能签名是[[a]] -> [a],如果我们检查hoogle,我们会看到这concat就是我们正在寻找的.

在这种情况下,列表理解是不必要的,因为我们只是迭代每个项目,所以我们真的想要做一个map.因此,由于结合map并且concat如此常见,我们可以写

concatMap (\x -> nPrint x x) [1..]
Run Code Online (Sandbox Code Playgroud)

如果你是haskell的新手,你可以忽略这一点但是由于concatMap我们也可以编写列表monad

[1..] >>= \x -> nPrint x x
Run Code Online (Sandbox Code Playgroud)

  • 如果我们真的想玩Haskell高尔夫,我们可以做`[1 ..] >> = join replicate`,使用`replicate`作为左上方建议上面和'join`函数来自`Control.Monad`(在这种情况下为`(( - >)r)`monad实例,类型为`(r - > r - > a) - > r - > a`). (5认同)