2017-12-10 18 views
1

私のtxtに人を追加するこのコードがあります。しかし、この名前では、たとえば、文字のみを許可したいと考えています。同様の年齢のように、私はただの数字にReadクラスのソースからHaskell getLineで1つのタイプのみを許可する方法

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

誰かが何か無効なものを入力した場合にどうしたらいいでしょうか? –

+0

例外メッセージが1つあり、getLineを繰り返す。 –

+1

getLineをラップする関数を作成し、[Data.Char](https://hackage.haskell.org/package/base-4.10.1.0/docs/Data-Char.html)から 'isLetter'のようなもので入力を検証します。 #v:isLetter) – Zpalmtree

答えて

5

を許可する:

class Read a where 
    readsPrec :: Int -> ReadS a 
    -- (...) 

このReadS何ですか? hoogleから:

type ReadS a = String -> [(a, String)] 

これは、私たちは書くことができますそれが失敗する可能性が読み取ります

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

それは、あなたのIOを変更する単純なケースです。ここで素早く汚れた例があります:

main = do 
    putStrLn "Enter an integer:" 

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

    num <- loop 
    print $ num + 1 
+0

ニース!どうも。この例を使用して文字のみを許可するにはどうすればよいですか? –

+3

準備ができているルーチンについては、 'Text.Read.readMaybe'も参照してください。 – chi

+2

@JoaoAlbuquerqueループを修正します。また、[hoogle](https://www.haskell.org/hoogle/)の「all」と「isLetter」。 – AJFarmar

関連する問題