나는 코드의 조각 다음 썼다. MonadTransformer
인스턴스없이 하나와 다른 하나는 :이해 MonadTransformer 예
-- Simple Get Password functions.
getPassphrase1 :: IO (Maybe String)
getPassphrase1 = do
password <- getLine
if isValid password
then return $ Just password
else return Nothing
askPassphrase1 :: IO()
askPassphrase1 = do
putStrLn "Enter password < 8 , alpha, number and punctuation:"
p <- getPassphrase1
case p of
Nothing -> do -- Q1. ### How to implement this with `MonadTrans` ?
putStrLn "Invalid password. Enter again:"
askPassphrase1
Just password ->
putStrLn $ "Your password is " ++ password
-- The validation test could be anything we want it to be.
isValid :: String -> Bool
isValid s = length s >= 8
&& any isAlpha s
&& any isNumber s
&& any isPunctuation s
또 다른 사용 MonadT
내가 나 자신을 썼다.
getPassphrase2 :: MaybeT IO String
getPassphrase2 = do
password <- lift getLine
guard $ isValid password
return password
askPassphrase2 :: MaybeT IO()
askPassphrase2 = do
lift $ putStrLn "Enter password < 8 , alpha, number and punctuation:"
p <- getPassphrase2
-- Q1. How to print "Invalid password" ?
lift $ putStrLn $ "Your password is " ++ p
-- The validation test could be anything we want it to be.
isValid :: String -> Bool
isValid s = length s >= 8
&& any isAlpha s
&& any isNumber s
&& any isPunctuation s
main :: IO()
main = do
a <- runMaybeT askPassphrase2
return()
두 가지 모두 작동합니다.
그러나 MonadTrans
예에 wrong password
지원을 추가하는 방법을 이해할 수 없습니다. ?
또한 main
방법이 좋습니다 ... 아니면 더 좋은 방법으로 작성 될 수 있습니까?
값을 사용하지 않으려면 값을 'a'에 바인딩 할 필요가 없습니다. 'main = runMaybeT askPassphrase >> return()' – chepner