Добрый день.
Вот простой фрагмент "угадать номер", содержащий единственную ошибку, но компилятор действительно затрудняет понимание того, что не так:
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
И это меня очень смущает, он сообщает, что что-то ожидалось типа '()', но как определить, кто это "что-то"? Это "к"? похоже не так. Это выглядит разумнее, если мы обмениваемся ожидаемыми и предполагаемыми, но то, как это выглядит сейчас, очень сбивает с толку. Мой вопрос: как определить причину и исправить эту ошибку?