簡體   English   中英

Haskell如何生成這個無限列表?

[英]Haskell how to generate this infinite list?

我看到這段代碼生成斐波納契數。

fibs = 1:1:(zipWith (+) fibs (tail fibs))

是否可以編寫類似的樣式代碼來生成無限列表[1 ..]?

我在Haskell網站上的循環結構上看到了這個鏈接

給出了一個例子

cyclic = let x = 0 : y
         y = 1 : x
     in  x

我試圖以循環方式為我的問題定義一個列表,但是不能成功。 我想要的是一個按照自身定義的列表,並在Hasekll中評估為[1 ..]。

注意:Haskell [1..]計算結果為[1,2,3,4,5...]而不是[1,1,1...]

以下應該給你想要的結果:

nats = 1 : map (+1) nats

或者,更具有慣用力:

nats = iterate (+1) 1

通過使用等式推理,很容易看出為什么第一個片段的評估結果為[1,2,3...]

nats = 1 : map (+1) nats 
     = 1 : map (+1) (1 : map (+1) nats) 
     = 1 : map (+1) (1 : map (+1) (1 : map (+1) nats))
     = 1 : 1 + 1 : 1 + 1 + 1 : .... 
     = [1,2,3...]

是。

考慮如何寫出列表中的每個元素:

1
1 + 1
1 + 1 + 1
1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1

每次輸入后,每個后續條目都會額外加+ 1 所以我們想從1開始,然后在每個后續元素中加1 然后我們想要獲取第二個元素並在之后的所有內容中添加1

以下是我們如何做到這一點:

let xs = 1 : map (+ 1) xs

這擴展如下:

1 : map (+ 1) xs
1 : (1 + 1) : map (+ 1) xs
1 : (1 + 1) : ((1 + 1) + 1) : map (+ 1) xs

等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM