2016-11-04 54 views
1

的問題如下:這個無限列表是如何計算的?

定義一個Haskell變量美元是大量的,你每年都要錢 無限的名單,假設你開始$ 100,並獲得 支付5%的利息,每年複利。 (忽略通貨膨脹,通貨緊縮, 稅收,救助,總經濟崩潰的可能性,以及其他 這樣的細節。)所以美元應該等於:[100.0,105.0,110.25, ...]。

我的解決方案如下,它的工作原理:

dollars::[Double] 
dollars = 100.0 : [1.05 * x | x<- dollars ] 

的問題是,我聽不太懂如何名單實際上是計算:

dollars= 100.0 : [1.05 * x | x<- dollars ] 
= 100.0 : [1.05 * x | x<- 100.0 : [1.05 * x | x<- dollars ] ] 
= 100.0 : (1.05 * 100.0) : [1.05 * x | x<- [1.05 * x | x<- dollars ] ] 
= 100.0 : 105.0 : [1.05 * x | x<- [1.05 * x | x<- dollars ] ] 
= 100.0 : 105.0 : [1.05 * x | x<- [1.05 * x | x<- 100.0 : [1.05 * x | x<- dollars ] ] ] 
= 100.0 : 105.0 : [1.05 * x | x<- 105.0:[1.05 * x | x<-[1.05 * x | x<- dollars ] ] ] 
= 100.0 : 105.0 : 110.25 :[1.05 * x | x<-[1.05 * x | x<-[1.05 * x | x<- dollars ] ] ] 

這是如何計算的?如果不是那麼如何?如果是的話,有沒有更簡單的方法來概念化這些計算?

回答

0

這或多或少是正確的。替換的順序取決於打印結果的代碼。 2.和3.行中的替換可以交換。

2

你是非常正確的。如果你將列表理解去掉了一個函數調用,它可能會有所幫助。相對應的是

dollars = 100.0 : map (* 1.05) dollars 

這則評估爲

= 100.0 : let dollars1 = 100 * 1.05 : map (*1.05) dollars1 in dollars1 
= 100.0 : 105.0 : let dollars2 = 105 * 1.05 : map (*1.05) dollars2 in dollars2 

等。我使用dollars1dollars2作爲標識符,儘管它們並不存在。