如何计算这个无限列表?

时间:2016-11-04 14:13:56

标签: haskell lazy-evaluation

问题如下:

  

定义一个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 ]  ]  ]

这是如何计算的?如果不是那么怎么样?如果是,是否有更简单的方法来概念化这些类型的计算?

2 个答案:

答案 0 :(得分: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作为标识符,即使它们确实不存在。

答案 1 :(得分:0)

这或多或少是正确的。替换发生的顺序取决于打印出结果的代码。可以交换2.和3.行中的替换。