[Haskell-cafe] A challenge

Claus Reinke claus.reinke at talk21.com
Wed Apr 8 13:32:51 EDT 2009

|No indeed – that's what I meant about the latter being quadratic – it
|runs the action far more times than the other.

'quadratic time' usually refers to complexity, not different results,
so I thought I'd mention it anyway.

|ghci tells me this:
|Prelude Control.Applicative Control.Arrow> let iterateM' = let f `op`
|x = uncurry (<$>) . ((:) &&& ((x=<<) . f)) in (foldr op (const $
|return []) .) . replicate
|     Ambiguous type variable `m' in the constraints:
|       `Monad m' arising from a use of `return' at <interactive>:
|       `Functor m' arising from a use of `op' at <interactive>:1:80-81
|     Probable fix: add a type signature that fixes these type

But surely you have not enabled the monomorphism restriction
while avoiding explicit recursion?-)

I should, of course, have removed those nasty points - sorry about
that, hope noone got hurt - to leave us with:

(foldr (flip (((uncurry (<$>).).).((((:)&&&).).((.).(=<<))))) (const $ return []).) . replicate

there, much better, isn't it? So obvious and clear that it doesn't even
need a name anymore - it is fully declarative and self-explanatory.
And it typechecks, so it must be correct!-) And it passes a test, so it
isn't wrong, either!-)

*Main> ((foldr (flip (((uncurry (<$>).).).((((:)&&&).).((.).(=<<)))))
    (const $ return []).) . replicate) 3 print ()

Sorry, just couldn't resist:-)
Now, how do I get that tongue out of my cheek?-)


More information about the Haskell-Cafe mailing list