> Are there safe versions anywhere, or do we have to define them ourselves?
There are some in the safe package. Also some prelude replacements like basic-prelude or classy-prelude that have their own renditions versions of some functions.
> (The same question arises with the functions and and or, and their boolean results, I think! Right?)
Product works for empty lists because 1 is a sensible answer and returning maybe is cumbersome, so it does the sensible thing. There are many times where I use any or all and I want it to work for empty lists rather than having to make my own version. This same goes for sum.
> "a" to "z" then "aa" to "zz" then "aaa" to "zzz" and so on! Is it to
difficult or impossible to create a function that enumerates all
possible strings?
It is possible, but what should the successor to "john" be? Should it be "johN" or "joho"? If there is more than one way to do a thing, it is better to leave the instance off and allow the user to specify his order in his own application. You can see such api design decisions come to the forefront in some modules like Data.Monoid where it could interpret integers as monoids over sums, products, or a multitude of other ways.
> To make a list with all the numbers from 20 to 1, you can't just do [20..1], you have to do [20,19..1].
It is that way because [20..1] desugars to enumFromTo 20 1, which chose to do it that way. Personally I'd be all for the change, but people have come to depend on the way it is now, and so it is possible that code would break if they changed it.
> Can anyone explain me why it works for the first few values, and not "completely"?
The problem with enumerating floats is that floats don't actually represent whole numbers well. On the hardware level there is a lot of fudging involved. A lot of people think that having an enum instance for float is a bad thing, but it is kept around because it can be useful sometimes. I actually agree with those people.