Я пытаюсь прочитать информацию, введенную пользователем, и проанализировать ее на тип Person
, который использует тип Gender
. Для этого я использую этот код:MaybeT/Maybe and IO: Отказоустойчивое чтение информации
data Person = Person String Int Gender String
data Gender = Male | Female | NotSpecified deriving Read
instance Show Gender where
show Male = "male"
show Female = "female"
show NotSpecified = "not specified"
instance Show Person where
show (Person n a g j) = "Person {name: " ++ n ++ ", age: " ++ show a ++
", gender: " ++ show g ++ ", job: " ++ j ++ "}"
readPersonMaybeT :: MaybeT IO()
readPersonMaybeT = do
putStrLn "Name?:"
name <- getLine
putStrLn "Age?:"
ageStr <- getLine
putStrLn "Gender?:"
genderStr <- getLine
putStrLn "Job?:"
job <- getLine
let newPerson = Person name (read ageStr) (read genderStr) job
putStrLn $ show newPerson
Теперь я хотел бы сделать это более отказоустойчивые - для достижения этой цели я пытался использовать MaybeT монады. с помощью этого, я получил этот код:
readPersonMaybeT :: MaybeT IO()
readPersonMaybeT = do
lift $ putStrLn "Name?:"
name <- lift getLine
lift $ putStrLn "Age?:"
ageStr <- lift getLine
lift $ putStrLn "Gender?:"
genderStr <- lift getLine
lift $ putStrLn "Job?:"
job <- lift getLine
let newPerson = Person name (read ageStr) (read genderStr) job
lift $ putStrLn "show newPerson"
It получить компилирует /, нагруженного GHCI, но когда я пытаюсь выполнить функцию readPersonMaybeT
Я получаю сообщения об ошибке
Нет экземпляра для (Data .Functor.Classes.Show1 IO) , возникающие при использовании `печати» в виде зЬтЬ интерактивной команды GHCi: распечатать его
Как я могу решить эту проблему? Написав этот код, я использовал wikibook о Monad Transformers.
EDIT: Когда я пытаюсь «запустить» его с runMaybeT
, он запускается, но он не является безотказным вообще. Ввод бессмыслицы для возраста, например, все еще приводит к результату, например
Лицо {имя: 85, возраст: *** Исключение: Prelude.read: нет синтаксического разбора.
Как вы его выполнили? Вы использовали ['runMaybeT'] (http://hackage.haskell.org/package/transformers-0.5.2.0/docs/src/Control.Monad.Trans.Maybe.html#runMaybeT)? – pdexter
Нет, я не знал, что мне нужно вызвать runMaybeT ... Но я попробовал это сейчас, и это не решило настоящую проблему (см. EDIT). – FlashTek
вы должны показать нам определение 'Person' – ErikR