![](/img/trans.png)
[英]Is there a way to generate a series of list comprehensions programmatically in Haskell?
[英]function that uses list comprehensions to generate a list of lists in Haskell
我想編寫一個使用列表推導來生成列表列表的函數,其工作方式如下:
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]
我希望先成為列表中的列表,然后我希望它能夠增加。 謝謝你的幫助!
讓我們先嘗試生成一個內部列表,對於某些限制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]]
我建議你這個:
make_list n = [ [1..m] | m <- [1..n] ]
然而,在你的第一次嘗試中有一些奇怪的東西:
make_list x = [x | x <- x, y <- [1..x]]
在那里你把x用於各種目的。 這只是感覺不對。
基於列表生成的遞歸版本,
makeList' :: Int -> [[Int]]
makeList' n
| n < 1 = []
| otherwise = [1..n] : makeList' (n-1)
makeList :: Int -> [[Int]]
makeList n = reverse $ makeList' n
makeList'
以相反的順序返回所需的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.