ich durch das Tutorial werde bei https://en.wikibooks.org/wiki/Haskell/Monad_transformersVerständnis MonadTransformer Beispiele
schrieb ich von Codes folgende Stück. Das eine ohne und andere mit MonadTransformer
Beispiel:
-- 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
Eine weitere Verwendung MonadT
, die ich selbst geschrieben.
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()
Beide funktioniert.
Aber ich kann nicht verstehen, wie wrong password
Unterstützung in MonadTrans
Beispiel hinzufügen. ?
Auch ist main
Methode ok .. oder es kann auf eine bessere Art geschrieben werden?
Keine Notwendigkeit, einen Wert an "a" zu binden, wenn Sie es nicht verwenden werden; 'main = runMaybeT askPassphrase >> return()' – chepner