
Matthias Fischmann wrote:
here is the bug, narrowed to four lines. a function that only sometimes terminates.
f = do n <- randomRIO (0,5) let l = replicate n '*' i = join $ repeat l -- infinite extension print (take 12 i)
In this paragraph I speak about just this program, ignoring that it is a lossy excerpt from another program for a different specification. This program, when corrected, will output the empty string with probability 1/6, and/or the string of twelve *'s with probability 5/6. This could be done more simply and less error-prone by writing "if n==0 then the former else the latter". In other words, I wonder why more information is produced (in the sense of information theory and entropy), only to be discarded, i.e., in 5/6 of the cases, you ask for 1 to 5 *'s, then discard that length and make them all 12. Along with the introduction of unnecessary work comes the introduction of unnecessary mistakes. In this paragraph I acknowledge that this program is a lossy excerpt from another program for a different specification. Still, if there is a sane way of mapping this program back to its origin, there is probably also some partial way of mapping my comment above to the original specification and program. I advise you to review your specification and program, and look for opportunities for eliminating unnecessary or indirect work; you may accidentally eliminate some mistakes along the way.