[Haskell-cafe] Stupid question #852: Strict monad

Jonathan Cast jonathanccast at fastmail.fm
Thu Jan 1 15:06:41 EST 2009

On Thu, 2009-01-01 at 14:25 -0500, Brian Hurt wrote:
> First off, let me apologize for this ongoing series of stupid newbie 
> questions.  Haskell just recently went from that theoretically interesting 
> language I really need to learn some day to a language I actually kinda 
> understand and can write real code in (thanks to Real World Haskell).  Of 
> course, this gives rise to a whole bunch of "wait- why is it this way?" 
> sort of questions.
> So today's question is: why isn't there a Strict monad?  Something like:
> data Strict a = X a

(Note that you can eliminate the `seq`s below by saying

  data Strict a = X !a

instead, or, if X is going to be strict,

  newtype Strict a = X a).

> instance Monad Strict where
>      ( >>= ) (X m) f = let x = f m in x `seq` (X x)
>      return a = a `seq` (X a)
> (although this code doesn't compile for reasons I'm not clear on- I keep 
> getting:
> temp.hs:4:0:
>      Occurs check: cannot construct the infinite type: b = Strict b
>      When trying to generalise the type inferred for `>>='
>        Signature type:     forall a b1.
>                            Strict a -> (a -> Strict b1) -> Strict b1
>        Type to generalise: forall a b1.
>                            Strict a -> (a -> Strict b1) -> Strict b1
>      In the instance declaration for `Monad Strict'
> as a type error.  Feel free to jump in and tell me what I'm doing
> wrong.)

Since you asked,

The simplest fix (that makes the code you posted compile) is to pattern
match on the result of f (to do what you want):

    (>>=) (X m) f = let X x = f m in x `seq` X x

(I would write

    X m >>= f = let X x = f m in X $! x)

But unless you export the X constructor (and don't make it strict), then
f should never return (X undefined), so the above is equivalent, for all
f in practice, to

    X m >>= f = f m

I think what you really want to say is

  newtype Strict alpha = X alpha
  instance Monad Strict where
    return = X
    X x >>= f = f $! x


More information about the Haskell-Cafe mailing list