Re: [Haskell-cafe] Can not use ST monad with polymorphic function

2012-12-03 Thread Dmitry Kulagin
> > Basically, quantified types can't be given as arguments to type >> constructors (other than ->, which is its own thing). I'm not entirely >> sure >> why, but it apparently makes the type system very complicated from a >> theoretical standpoint. By wrapping the quantified type in a newtype, the

Re: [Haskell-cafe] Can not use ST monad with polymorphic function

2012-12-02 Thread Heinrich Apfelmus
David Menendez wrote: On Thu, Nov 29, 2012 at 7:50 AM, Dmitry Kulagin wrote: Thank you, MigMit! If I replace your type FoldSTVoid with: data FoldMVoid = FoldMVoid {runFold :: Monad m => (Int -> m ()) -> m ()} then everything works magically with any monad! That is exactly what I wanted, thoug

Re: [Haskell-cafe] Can not use ST monad with polymorphic function

2012-12-01 Thread David Menendez
On Thu, Nov 29, 2012 at 7:50 AM, Dmitry Kulagin wrote: > Thank you, MigMit! > > If I replace your type FoldSTVoid with: > data FoldMVoid = FoldMVoid {runFold :: Monad m => (Int -> m ()) -> m ()} > > then everything works magically with any monad! > That is exactly what I wanted, though I still do

Re: [Haskell-cafe] Can not use ST monad with polymorphic function

2012-11-29 Thread Dmitry Kulagin
Thank you, MigMit! If I replace your type FoldSTVoid with: data FoldMVoid = FoldMVoid {runFold :: Monad m => (Int -> m ()) -> m ()} then everything works magically with any monad! That is exactly what I wanted, though I still do not quite understand why wrapping the type solves the problem Dmitr

Re: [Haskell-cafe] Can not use ST monad with polymorphic function

2012-11-28 Thread MigMit
Yes, monomorphism. "do" binding requires your fold'' to be of some monomorphic type, but runST requires some polymorphism. If you want, you can use special type like that: data FoldSTVoid = FoldSTVoid {runFold :: forall a. (Int -> ST a ()) -> ST a ()} fold :: Monad m => (Int -> m ()) -> m () fo

[Haskell-cafe] Can not use ST monad with polymorphic function

2012-11-28 Thread Dmitry Kulagin
Hi Cafe, I try to implement some sort of monadic fold, where traversing is polymorphic over monad type. The problem is that the code below does not compile. It works with any monad except for ST. I suspect that monomorphism is at work here, but it is unclear for me how to change the code to make i