
Yes, this works. Is this because I was using the Cont monad transformer instead of a plain coninutation monad? And with a plain continuation monad (String -> String) -> String would have worked? Does everybody use the transformer these days? Is a plain continuation monad still around? Am 07/12/2014 05:12 PM, schrieb David McBride:
It's because the type of f is not (String -> String) -> String
It is (String -> Identity String) -> Identity String
Do a replacement manually and you'll see that f has to be of type -> ContT String Identity String --> ContT (String -> Identity String) -> Identity String)
You can see that in the error message Expected type: ContT String Identity String, Actual type: ContT Char [] String. The reason why it looks weird is that it is assuming that your monad instead of being identity is [], and that the r in "m r" must be a Char in order for that to work. I'm not really sure why it chose list, probably type defaulting rules.
On Sat, Jul 12, 2014 at 6:24 AM, martin
mailto:martin.drautzburg@web.de> wrote: Hello all,
I just started trying to understand Continuations, but my very first exercise already left me mystified.
import Control.Monad.Cont
resultIs :: Int -> Cont String String resultIs i = ContT $ f where f :: (String -> a) -> a f k = k ("result=" ++ show i)
If resultIs returns a Cont String String, then f should be (String->String)->String, but that doesn't compile. Why is that so? _______________________________________________ Beginners mailing list Beginners@haskell.org mailto:Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners