Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:如果输入验证失败,我希望它再次请求相同的输入_Haskell - Fatal编程技术网

Haskell:如果输入验证失败,我希望它再次请求相同的输入

Haskell:如果输入验证失败,我希望它再次请求相同的输入,haskell,Haskell,如果我输入一个名称并且验证函数失败,我希望用户重新输入名称,直到它通过验证函数。如何操作?您可以使用一个helper函数,该函数将重复执行,直到输入有效的名称,而不是使用getLine来获取名称 registerUser1 userDb = putStrLn "Enter the email " >> getLine >>= \email -> putStrLn "Enter the name " >> getLine >>

如果我输入一个名称并且验证函数失败,我希望用户重新输入名称,直到它通过验证函数。如何操作?

您可以使用一个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
您可以使用一个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