
On Fri, Oct 3, 2008 at 12:43 PM, Andrew Coppin
factorise n = do x <- [1..] y <- [1..] if x*y == n then return (x,y) else fail "not factors"
This is a very stupid way to factorise an integer. (But it's also very general...) As you may already be aware, this fails miserably because it tries all possible values for y before trying even one new value for x. And since both lists there are infinite, this causes an endless loop that produces (almost) nothing.
You should look at LogicT at http://okmij.org/ftp/Computation/monads.html The magic words you are looking for are "fair disjunction" and "fair conjunction". The paper is full of mind-stretching code but it already does everything you want. And it is a monad transformer already, so it's easy to attach Error to it. -- ryan