получить значение из домена ввода-вывода в мир Haskell
Вы используете оператор связывания: (>>=) :: Monad m => m a -> (a -> m b) -> m b
.
Если m = IO
, то это выглядит так: (>>=) :: IO a -> (a -> IO b) -> IO b
.
Как видите, функция с типом a -> IO b
обращается к a
без IO
.
Так, учитывая значение в монаде IO, например, getLine :: IO String
getInt :: IO Int
getInt = getLine >>= (\s -> return (read s))
Здесь s :: String
, read :: String -> Int
и return :: Int -> IO Int
.
Вы можете переписать это, используя do-block:
getInt :: IO Int
getInt = do
s <- getLine
return (read s)
Или используйте стандартную библиотечную функцию, которая делает именно это:
getInt :: IO Int
getInt = readLn
Что касается вашего примера, вы можете немедленно исправить это с помощью let-привязки:
foo :: IO ()
foo = do
input <- sequence [getLine, getLine, getLine]
let ints = bar input
mapM_ print ints
bar :: [String] -> [Int]
bar = map read
Или вы можете реструктурировать его для использования getInt
, как определено выше:
foo :: IO ()
foo = sequence [getInt, getInt, getInt] >>= mapM_ print