2016-11-04 2 views
1

Le problème est le suivant:Comment cette liste infinie est-elle calculée?

Définir un dollar variables Haskell qui est la liste infinie des montants d'argent que vous avez chaque année, en supposant que commencer avec 100 $ et obtenez payé 5% d'intérêt, composé annuellement. (Ignorer l'inflation, la déflation, les renflouements, la possibilité d'un effondrement économique total et d'autres détails de ce genre.) Donc, les dollars devraient être égaux à: [100.0, 105.0, 110.25, ...].

Ma solution est la suivante et il fonctionne:

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

Le problème est que j'ai du mal à comprendre la façon dont la liste est calculée en pratique:

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 ] ] ] 

etc.

Est-ce ainsi que c'est calculé? Si non alors comment? Si oui, existe-t-il un moyen plus simple de conceptualiser ces types de calculs?

Répondre

0

C'est plus ou moins correct. Dans quel ordre les substitutions se produisent dépend du code qui imprime les résultats. Les substitutions dans les lignes 2. et 3. pourraient être permutées.

2

Vous avez à peu près raison. Il pourrait être utile de dé-sucrer la liste de compréhension dans un appel de fonction. L'équivalent est

dollars = 100.0 : map (* 1.05) dollars 

Cette évalue ensuite

= 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 

et ainsi de suite. J'utilise dollars1, dollars2 comme identifiants, même s'ils n'existent pas vraiment.