[Haskell-cafe] Catering for similar operations with and without
state
phil at beadling.co.uk
phil at beadling.co.uk
Mon Jul 6 20:37:05 EDT 2009
Well, the simplest solution I can think of is below. The
OtherNormalStateT doesn't actually have any state at all, but still
gets state from the StateT 'below' it and returns a result.
This is still a bit ugly, but it compiles - and although I haven't
tested it properly yet, simply implementing the 'other' helper
function to do the work should be fine.
It's a question of how smart the compiler is. Obviously this is
inefficient in theory, but will the compiler notice we are passing
around a 'unit' state and that the s -> (a,s) function doesn't care
about the input.... perhaps. I'd expect the overhead from this to be
fairly small and it does allow me to continue using the same paradigm
for stateless versions of my normal generator.
I have seen people do similar things when they wish to carry around
state but have no result, and thus the result is set to (). I can't
see why this is any less inefficient than that?
type BoxMullerStateT = StateT (Maybe Double)
type BoxMullerRandomStateStack = BoxMullerStateT MyRngState
instance NormalClass BoxMullerRandomStateStack where
generateNormal = StateT $ \s -> case s of
Just d -> return (d,Nothing)
Nothing -> do qrnBaseList <- nextRand
let (norm1,norm2) = boxMuller (head qrnBaseList) (head $
tail qrnBaseList)
return (norm1,Just norm2)
-- New stateless StateT below!
type OtherNormalStateT = StateT ()
type OtherRandomStateStack = OtherNormalStateT MyRngState
instance NormalClass OtherRandomStateStack where
generateNormal = StateT $ \_ -> do rn:rns <- nextRand
return ( other rn, () )
On 17 Jun 2009, at 07:38, Jason Dagit wrote:
> Hi Phil,
>
> On Mon, Jun 15, 2009 at 5:23 PM, Phil <phil at beadling.co.uk> wrote:
> Hi,
>
> I'm trying to think around a problem which is causing me some
> difficulty in Haskell.
>
> I'm representing a stateful computation using a State Transform -
> which works fine. Problem is in order to add flexibility to my
> program I want to performs the
<snip>
> g my own Monad from scratch but this crossed my mind as another
> possibillity - i.e. a Monad that either has a state of maybe double,
> or has no state at all?
>
> I have a feeling I'd just 'return' the pure computations into the
> state monad. My example code above seems weird and heavy weight to
> me.
>
> I'd love to see what you figure you.
>
> Jason
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090706/f9a64d1b/attachment.html
More information about the Haskell-Cafe
mailing list