使用列表推导在Haskell中生成列表列表的函数

时间:2014-10-20 00:53:05

标签: list haskell list-comprehension

我想编写一个使用列表推导的函数来生成一个列表,列表如下:

makeList 3 == [[1],[1,2],[1,2,3]]
makeList 5 == [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]]
makeList (-2) == []

我最终得到了这个解决方案,但它显然没有从问题中找到它所需要的东西:

let makelist x = [x | x <- x, y <- [1..x]]

所以如果我输入这个

Prelude> makelist [3]

输出将显示如下:

[3,3,3]

我希望先成为列表中的列表,然后我希望它能够增加。谢谢你的帮助!

3 个答案:

答案 0 :(得分:7)

让我们先尝试生成一个内部列表,对于某些限制m

> let inner m = [1..m]
> inner 5
[1,2,3,4,5]

现在,请注意您的外部列表n[inner 1, inner 2, inner 3, ..., inner n],或者是列表理解形式:

> let outer n = [inner m | m <- [1..n]]
> outer 3
[[1], [1,2], [1,2,3]]

所以我们可以将两者合并到单个列表理解表达式中:

> let makeList n = [[1..m] | m <- [1..n]]
> makeList 4
[[1],[1,2],[1,2,3],[1,2,3,4]]

答案 1 :(得分:3)

我建议你:

make_list n = [ [1..m] | m <- [1..n] ]

然而,在你的第一次尝试中有一些奇怪的东西:

make_list x = [x | x <- x, y <- [1..x]]

你把x用于各种目的。这只是感觉不对。

答案 2 :(得分:1)

基于列表生成的递归版本,

makeList' :: Int -> [[Int]]
makeList' n
  | n < 1 = []
  | otherwise = [1..n] : makeList' (n-1)


makeList :: Int -> [[Int]]
makeList n = reverse $ makeList' n

makeList'以相反的顺序返回所需的结果。