Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you recognize an infinite list in a Haskell program? [duplicate]

Tags:

Possible Duplicate:
How to tell if a list is infinite?

In Haskell, you can define an infinite list, for example [1..]. Is there a built-in function in Haskell to recognize whether a list has finite length? I don't imagine it is possible to write a user-supplied function to do this, but the internal representation of lists by Haskell may be able to support it. If not in standard Haskell, is there an extension providing such a feature?

like image 405
quant_dev Avatar asked Mar 27 '12 12:03

quant_dev


People also ask

Can Haskell have infinite list?

Functional Programming in Haskell: Supercharge Your CodingIt's permitted to do a finite amount of processing in an infinite list, but not to traverse it infinitely. only evaluates list elements as they are needed.

How do you know if a list has equal Haskell?

You can just use == on them directly. This means that lists instantiate Eq as long as the element type also instantiates Eq , which is the case for all types defined in the standard Prelude except functions and IO actions.


1 Answers

No, this is not possible. It would be impossible to write such a function, because you can have lists whose finiteness might be unknown: consider a recursive loop generating a list of all the twin primes it can find. Or, to follow up on what Daniel Pratt mentioned in the comments, you could have a list of all the steps a universal Turing machine takes during its execution, ending the list when the machine halts. Then, you could simply check whether such a list is infinite, and solve the Halting problem!

The only question an implementation could answer is whether a list is cyclic: if one of its tail pointers points back to a previous cell of the list. However, this is implementation-specific (Haskell doesn't specify anything about how implementations must represent values), impure (different ways of writing the same list would give different answers), and even dependent on things like whether the list you pass in to such a function has been evaluated yet. Even then, it still wouldn't be able to distinguish finite lists from infinite lists in the general case!

(I mention this because, in many languages (such as members of the Lisp family), cyclic lists are the only kind of infinite lists; there's no way to express something like "a list of all integers". So, in those languages, you can check whether a list is finite or not.)

like image 133
ehird Avatar answered Sep 28 '22 08:09

ehird