Haskell:如果输入验证失败,我希望它再次请求相同的输入
如果我输入一个名称并且验证函数失败,我希望用户重新输入名称,直到它通过验证函数。如何操作?您可以使用一个helper函数,该函数将重复执行,直到输入有效的名称,而不是使用getLine来获取名称Haskell:如果输入验证失败,我希望它再次请求相同的输入,haskell,Haskell,如果我输入一个名称并且验证函数失败,我希望用户重新输入名称,直到它通过验证函数。如何操作?您可以使用一个helper函数,该函数将重复执行,直到输入有效的名称,而不是使用getLine来获取名称 registerUser1 userDb = putStrLn "Enter the email " >> getLine >>= \email -> putStrLn "Enter the name " >> getLine >>
registerUser1 userDb =
putStrLn "Enter the email " >> getLine >>= \email ->
putStrLn "Enter the name " >> getLine >>= \name ->
putStrLn "Enter the password " >> getLine >>= \password ->
putStrLn "Enter the postal code " >> getLine >>= \postalcode ->
let newuser = MkNewUser{nuserEmail = MkEmail email, nuserFullName = name, nuserPassword = password, nuserPostalCode = postalcode}
output = (registerUser newuser userDb)
in case output of
Left err -> putStrLn err >> registerUser1 userDb
Right udb -> pure udb
您还可以使用do表示法使registerUser1的定义噪音更小,并将其嵌套到您上面编写的相同代码中
getParameter label valid = loop
where
loop = do
putStrLn $ "Enter the " ++ label
value <- getLine
if valid value
then pure value
else do
putStrLn $ "Invalid value for " ++ label
loop
使用上述辅助功能:
registerUser1 userDb = do
putStrLn "Enter the email"
email <- getLine
putStrLn "Enter the name"
name <- getName
putStrLn "Enter the password"
password <- getLine
putStrLn "Enter the postal code"
postalcode <- getLine
let
newuser = MkNewUser
{ nuserEmail = MkEmail email
, nuserFullName = name
, nuserPassword = password
, nuserPostalCode = postalcode
}
output = registerUser newuser userDb
case output of
Left err -> do
putStrLn err
registerUser1 userDb
Right udb -> pure udb
您可以使用一个helper函数来代替getLine来获取名称,该函数将重复执行,直到输入有效名称为止
registerUser1 userDb =
putStrLn "Enter the email " >> getLine >>= \email ->
putStrLn "Enter the name " >> getLine >>= \name ->
putStrLn "Enter the password " >> getLine >>= \password ->
putStrLn "Enter the postal code " >> getLine >>= \postalcode ->
let newuser = MkNewUser{nuserEmail = MkEmail email, nuserFullName = name, nuserPassword = password, nuserPostalCode = postalcode}
output = (registerUser newuser userDb)
in case output of
Left err -> putStrLn err >> registerUser1 userDb
Right udb -> pure udb
您还可以使用do表示法使registerUser1的定义噪音更小,并将其嵌套到您上面编写的相同代码中
getParameter label valid = loop
where
loop = do
putStrLn $ "Enter the " ++ label
value <- getLine
if valid value
then pure value
else do
putStrLn $ "Invalid value for " ++ label
loop
使用上述辅助功能:
registerUser1 userDb = do
putStrLn "Enter the email"
email <- getLine
putStrLn "Enter the name"
name <- getName
putStrLn "Enter the password"
password <- getLine
putStrLn "Enter the postal code"
postalcode <- getLine
let
newuser = MkNewUser
{ nuserEmail = MkEmail email
, nuserFullName = name
, nuserPassword = password
, nuserPostalCode = postalcode
}
output = registerUser newuser userDb
case output of
Left err -> do
putStrLn err
registerUser1 userDb
Right udb -> pure udb