Вот что вы написали:
for' :: a -> (a -> Bool) -> (a -> a ) -> (a -> IO a ) -> IO [a]
for' s cnd incr ioFn = sequenceIO (map (ioFn) ...
*Main> for' 1 (\i->i==10) (\i->i+1) (print )
a (a -> IO ())
------------
() a ~ ()
Таким образом 1 :: (Num a) => a ~ (Num ()) => ()
.Но для типа ()
.
нет экземпляра Num
. Это окольный способ сказать вам, что вам нужна функция типа a -> IO a
, а не a -> IO ()
.
Хиндли-Милнер допускает объединение с «более узким» типом, но здесь было бы лучше, если бы его не было - сообщение об ошибке было бы намного понятнее.
В любом случае этолегко вызвать в воображении ваше собственное значение - возврат печать , например
myprint :: a -> IO a
myprint x = do { print x -- or, print x >> return x
; return x
}