【发布时间】:2016-08-08 13:52:42
【问题描述】:
我正在尝试读取用户输入的信息并将其解析为Person 类型,该类型使用Gender 类型。为此,我使用以下代码:
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 monad。使用这个,我得到了这个代码:
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"
它由 GHCI 编译/加载,但是当我尝试执行 readPersonMaybeT 函数时,我收到错误消息
(Data.Functor.Classes.Show1 IO)没有实例 因使用“打印”而产生 在交互式 GHCi 命令的 stmt 中:打印它
我该如何解决这个问题?编写这段代码时,我使用了关于 Monad Transformers 的wikibook。
编辑:当我尝试使用runMaybeT '运行'它时,它会被执行,但它根本不是故障安全的。例如,输入年龄的废话仍然会导致输出类似于
Person {name: 85, age: *** Exception: Prelude.read: no parse.
【问题讨论】:
标签: haskell io monad-transformers maybe