Вы, вероятно, хотите немного реструктурировать вещи, так как у вас есть IO, перепутанный с чем-то, что не должно быть. Как насчет изменения подписи на что-то вроде этого?
getChar :: Int -> String -> Maybe Char
getChar n x | n < length x = Just (x !! n)
| otherwise = Nothing
Data.Maybe позволяет указать, что вы собираетесь что-то возвращать (например, длина находится в пределах диапазона) или Nothing (длина не находится в пределах диапазона). Функция, которая вызывает getChar
, может затем решить, что делать с вещами. Data.Either предоставляет способ возврата сообщения об ошибке с ошибкой. Из того, что я видел (и я ни в коем случае не эксперт), исключения редко используются в Haskell, а типы выбора, такие как Either
или Maybe
, используются гораздо чаще.
Теперь в коде, который вызывает это, вы можете использовать сопоставление с образцом, чтобы увидеть, что произошло, например,
main :: IO ()
main = do
x <- getLine
let z = getChar' 5 x
case z of
(Just z) -> print $ "The 5th character is " ++ show z
Nothing -> print $ "The 5th character is out of range"