如何在Haskell getLine中只允许一种类型

Joa*_*que 1 haskell typing

我有这个代码,可以在我的txt中添加一个人.但在名称中,例如,我想只允许字母.和年龄一样,我只想允许数字

add = do
    putStrLn "Name:"
    name <- getLine
    putStrLn "Age:"
    age <- getLine
    let new =  (name ++ " "++ idade ++ "\n")
    appendFile "funcionarios.txt" new
    putStrLn "Success!"
Run Code Online (Sandbox Code Playgroud)

AJF*_*mar 5

来自Read班级来源:

class Read a where
  readsPrec :: Int -> ReadS a
  -- (...)
Run Code Online (Sandbox Code Playgroud)

这是什么ReadS?来自hoogle:

type ReadS a = String -> [(a, String)]
Run Code Online (Sandbox Code Playgroud)

这允许我们编写可能失败的读取:

maybeRead :: Read a => String -> Maybe a
maybeRead str = case readsPrec 0 str of
    [(a, "")] -> Just a
--    ^   ^---- no remaining input string
--    |- output
    _         -> Nothing
Run Code Online (Sandbox Code Playgroud)

这是一个修改IO的简单案例.这是一个快速的脏例子:

main = do
  putStrLn "Enter an integer:"

  let loop = do
        str <- getLine
        maybe loop return (maybeRead str :: Maybe Int)

  num <- loop
  print $ num + 1
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅`Text.Read.readMaybe`了解即食常规. (3认同)
  • @JoaoAlbuquerque修改循环.此外,[hoogle](https://www.haskell.org/hoogle/)`all`和`isLetter`. (2认同)