[Haskell-beginners] lifting to applicative: recomputing an argument each time it is used?

Iain Nicol iain at thenicols.net
Sun Sep 9 01:29:38 CEST 2012

On 2012-09-09, Chaddaï Fouché <chaddai.fouche at gmail.com> wrote:
> On Sat, Sep 8, 2012 at 4:49 PM, Iain Nicol <iain at thenicols.net> wrote:
>> Hi,
>> I think I'm trying to lift 'Data.List.intersperse' (to applicative or
>> a monad) in such a way that its (first) argument is recomputed each
>> time it is used.
> Instead of using intersperse, just generate two list and interlace
> them (interlace is easy to write, though not in Data.List [...] That
> seems more elegant to me but you'll judge :)

I appreciate the response.  Your suggestion was indeed significantly
cleaner than what I had come up with.  And your second response has
encouraged me to explore the "Test.QuickCheck.Modifiers" module in

Nonetheless, I was still hoping to reuse the intersperse function, and
so I spent "a little" bit more time on this problem.  After hours of
experimenting in the wrong direction, the following accidentally came to

import Test.QuickCheck (elements, Gen, sized)
import Data.List (intersperse)

mixIntersperse :: Gen String -> Gen String -> Gen [String]
mixIntersperse genSep genWord =
  sized (sequence . intersperse genSep . (`replicate` genWord))


More information about the Beginners mailing list