2009/7/22 Matthias Görgens <matthias.goergens@googlemail.com>
I need to take some elements from the front of a list.  However the
criteria are somewhat complex.

> walk f [] = []
> walk f (x:xs) = case f x
>                 of Just g -> x : walk g xs
>                    Nothing -> []

For each item the `predicate' f either returns Nothing, when it thinks
we should not take any more elements, or return Just another
`predicate' to apply to the next element.

However the type system does not like my function.  How can I mollify it?

At a quick glance it looks to me like the type of f is infinite.  Something like:
f :: a -> Maybe (a -> Maybe (a -> ...))

When I've seen people solve similar problems in the past they have introduced a data type to hide the infinite type.  See for example, the solution to defining fix:
http://blog.plover.com/prog/springschool95-2.html

I didn't actual read that article, but it appears to explain the technique.

Jason