In my previous post I discussed infinite lists in Haskell. As it happens the concept may be useful beyond it. As we saw before, using them may yield nice and concise definitions for series. In this post I'm going to show you one way to port the concept to Python.
In Haskell we define naive infinite lists using [1,2..] kind of syntax. I decided to use a class based syntax to mimic this. This particular snippet would be written as InfList(1, 2) in this scheme. The same works for negative numbers as well. You could write InfList(-1, -2) and expect that to work as well.
So what does "InfList(1, 2)" actually do? Consider the following example showing some initial tests of mine:
As you can see once you instantiate the object, you'll have access to its content just like in the case of a regular list. It calculates the values needed on demand. In other words it's lazy.
The example above also showcases the use of lambdas (fibo) and Python's slice syntax. The implementation infers the rule used to generate the series by default. If you want, you can provide a custom lambda that can be used instead. The slice syntax allows you to mimic Haskell's "take".
Besides the aforementioned functionality I ended up implementing __unicode__ just to make it easier to see the first items of the list.
I've listed the actual implementation below. Overall it ended up being surprisingly simple.
Just having a way to access list items isn't enough. In my previous post I used "zip" and "concat" to combine multiple infinite lists. It's also handy to be able to map and filter the lists. In order to do this I ended up implementing little wrappers for these operations. I've listed the implementation and some tests below.
As you can see there's some overhead. I do think these kind of functions yield some extra power to the concept overall. There are many ways to combine these.