【问题标题】:Haskell : If the input fails validation, i want it to ask for the same input againHaskell:如果输入验证失败,我希望它再次请求相同的输入
【发布时间】:2018-03-06 12:48:20
【问题描述】:
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

如果我输入了一个名称并且如果它未能通过验证功能,我希望用户重新输入该名称,直到它通过验证功能。我该怎么做?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    您可以使用辅助函数代替getLine 来获取名称,该函数会重复直到输入有效名称。

    getName = do
      putStrLn "Enter the name"
      name <- getLine
      if null name  -- Replace with your own validation.
        then do
          putStrLn "Invalid name"
          getName
        else pure name
    

    这也可以在let 绑定或where 子句中本地定义。如果您要对所有这些字段执行验证,则需要抽象帮助器以将提示和验证函数作为参数:

    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
    

    您还可以使用 do 表示法来减少 registerUser1 的定义和嵌套 - 它与您在上面编写的代码相同。

    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
    

    使用上面的辅助函数:

    registerUser1 userDb = do
      email <- getParameter "email" validEmail
      name <- getParameter "name" validName
      password <- getParameter "password" validPassword
      postalcode <- getParameter "postal code" validPostalCode
      …
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多