我想编写一个使用列表推导的函数来生成一个列表,列表如下:
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]
我希望先成为列表中的列表,然后我希望它能够增加。谢谢你的帮助!
答案 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'
以相反的顺序返回所需的结果。