28 Nov 18:52 2012

## Can not use ST monad with polymorphic function

Dmitry Kulagin <dmitry.kulagin <at> gmail.com>

2012-11-28 17:52:30 GMT

2012-11-28 17:52:30 GMT

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 it work with ST.

fold :: Monad m => (Int -> m ()) -> m ()

fold f = mapM_ f [0..20]

selectFold :: Monad m => String -> IO ((Int -> m ()) -> m ())

selectFold method = do

-- in real program I'd like to choose between

-- different fold methods, based on some IO context

return fold

useFold :: Monad m => ((Int -> m ()) -> m ()) -> m ()

useFold fold' = fold' f

where f _ = return () -- some trivial iterator

main = do

fold'' <- selectFold "some-method-id"

print $ runST $ useFold fold''

Thank you!

Dmitry

_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe <at> haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe