Как понимать сообщения компилятора Haskell

Добрый день.

Вот простой фрагмент "угадать номер", содержащий единственную ошибку, но компилятор действительно затрудняет понимание того, что не так:

import System.Random
import Control.Monad
import Control.Monad.Cont

main = do
  rn <- randomRIO (1,10) :: IO Int
  runContT (callCC $ \k -> forever $ do
    lift $ putStr "Your number:"
    n <- lift (fmap read getLine)
    when (n == rn) $ k
    lift $ putStrLn $ if (n > rn) 
                      then "Too much" 
                      else "Too little") (return)
  putStrLn $ "Good guess! " ++ (show rn)

GHC выдает ошибку:

> simple.hs:11:21:
>     Couldn't match expected type `()' against inferred type `m b'
>       Expected type: a -> ()
>       Inferred type: a -> m b
>     In the second argument of `($)', namely `k'
>     In a stmt of a 'do' expression: when (n == rn) $ k

И это меня очень смущает, он сообщает, что что-то ожидалось типа '()', но как определить, кто это "что-то"? Это "к"? похоже не так. Это выглядит разумнее, если мы обмениваемся ожидаемыми и предполагаемыми, но то, как это выглядит сейчас, очень сбивает с толку. Мой вопрос: как определить причину и исправить эту ошибку?

5
задан Don Stewart 21 April 2011 в 17:18
поделиться