2014-11-27 3 views
1

У меня есть следующий кодHaskell - Строка, где требуется целое

data Ops = Sum Integer | Div Integer | None deriving (Read) 

main = do 
    ans <- getLine 
print $ case read ans of 
    Sum n -> sum n 
    Div n -> div n 

Я хочу, чтобы отобразить сообщение об ошибке пользователю за неправильный ввод

Nothing -> "Error" 

Я понимаю, что я не могу всунуть строка, здесь, как я могу реализовать условие ошибки

ответ

4

Лучшим выбором было бы использовать readMaybe от Text.Read:

import Text.Read (readMaybe) 

data Ops 
    = Sum Integer 
    | Div Integer 
    | None 
    deriving (Eq, Show, Read) 

main :: IO() 
main = do 
    ans <- getLine 
    case readMaybe ans of 
     Nothing -> putStrLn "Error" 
     Just x -> print $ handleInput x 
    where 
     handleInput (Sum n) = sum n 
     handleInput (Div n) = div n 

Это позволяет разделить обработку ошибок от того, как вы справляетесь вход, потянув, что из в чистую функцию от IO

0

Если вы не можете использовать модуль как Text.Read здесь в том, как определить readMaybe с точки зрения просто функций Прелюдии:

data Foo = Sum Int Int | Div Int Int deriving (Show,Read) 

readMaybe str = 
    case reads str of 
    [] -> Nothing 
    ((a,_):_) -> Just a 

main = do 
    str <- getLine 
    case readMaybe str of 
    Nothing   -> putStrLn "bad input" 
    Just (Sum a b) -> print $ a + b 
    Just (Div a b) -> print $ div a b 
Смежные вопросы