35 lines
1019 B
Haskell
35 lines
1019 B
Haskell
module Person where
|
|
|
|
type Name = String
|
|
type Age = Integer
|
|
|
|
data Person = Person Name Age deriving Show
|
|
|
|
data PersonInvalid = NameEmpty
|
|
| AgeTooLow
|
|
| PersonInvalidUnknown String
|
|
deriving (Eq, Show)
|
|
|
|
mkPerson :: Name -> Age -> Either PersonInvalid Person
|
|
mkPerson name age
|
|
| name /= "" && age > 0 = Right $ Person name age
|
|
| name == "" = Left NameEmpty
|
|
| not (age > 0) = Left AgeTooLow
|
|
| otherwise =
|
|
Left $ PersonInvalidUnknown $
|
|
"Name was: " ++ show name ++ " Age was: " ++ show age
|
|
|
|
showPerson :: Either PersonInvalid Person -> String
|
|
showPerson (Left NameEmpty) = "Name is empty"
|
|
showPerson (Left AgeTooLow) = "Age is too low"
|
|
showPerson (Left (PersonInvalidUnknown e)) = e
|
|
showPerson (Right p) = "Yay! Successfully got a person: " ++ (show p)
|
|
|
|
gimmePerson :: IO ()
|
|
gimmePerson = do
|
|
putStr "Enter your name: "
|
|
name <- getLine
|
|
putStr "Enter your age: "
|
|
age <- getLine
|
|
putStrLn $ showPerson $ mkPerson name (read age)
|