我想讀取用戶輸入的信息並將其解析爲類型Person
,該類型使用Gender
類型。要做到這一點,我用這個代碼:MaybeT /可能和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"
它得到編譯/由GHCI加載,但是當我嘗試執行readPersonMaybeT
功能我得到的錯誤消息
沒有實例(數據.Functor.Classes.Show1 IO)從使用'打印」 的在交互式GHCI命令的語句產生 :打印
我怎樣才能解決這個問題呢?編寫這段代碼,我使用了關於Monad變形金剛的wikibook。
編輯:當我試圖'運行'它與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 ......但我現在試了一下,並沒有解決真正的問題(請參閱編輯)。 – FlashTek
你應該告訴我們'人'的定義 – ErikR