Haskell 如何将getLine设置为仅接收可转换为数字的字符串? main=do putStrLn“你好,请问姓名?” 首先,这里有一个快速的想法可以帮助你: main = do putStrLn "Hello,Name please?" first <-
如何将getLine设置为仅接收可转换为数字的字符串?Haskell 如何将getLine设置为仅接收可转换为数字的字符串? main=do putStrLn“你好,请问姓名?” 首先,这里有一个快速的想法可以帮助你: main = do putStrLn "Hello,Name please?" first <- ,haskell,functional-programming,Haskell,Functional Programming,如何将getLine设置为仅接收可转换为数字的字符串? main=do putStrLn“你好,请问姓名?” 首先,这里有一个快速的想法可以帮助你: main = do putStrLn "Hello,Name please?" first <- getLine second <- getLine third <- getLine if (second == "divide") then putStrLn (show (read first ::Double )/ (read
main=do
putStrLn“你好,请问姓名?”
首先,这里有一个快速的想法可以帮助你:
main = do
putStrLn "Hello,Name please?"
first <- getLine
second <- getLine
third <- getLine
if (second == "divide") then putStrLn (show (read first ::Double )/ (read third :: Double))
else putStrLn "Cannot do"
如果用户输入一个随机字符串,会发生什么?没有考虑到这一点,可能会抛出一个错误?与其定义自己的验证器,为什么不使用readMaybe
fromText.Read
@雷恩里奇:是的,这样做是绝对有效的(甚至更好)。
import Control.Applicative
import Data.Char
getNum :: (Num a, Read a) => IO (Maybe a)
getNum = do
(x, xs) <- break (not . isDigit ) <$> getLine
case xs of
[] -> return $ Just $ read x
_ -> return Nothing
main :: IO ()
main = do
x <- getNum :: IO (Maybe Double)
case x of
Nothing -> do
putStrLn "Not a number, try again"
main
Just x' ->
putStrLn $ "Your number: " ++ show x'
return ()
import Control.Applicative
import Data.Char
import Data.Maybe
getNum :: (Num a, Read a) => IO (Maybe a)
getNum = do
(x, xs) <- break (not . isDigit ) <$> getLine
case xs of
[] -> return $ Just $ read x
_ -> return Nothing
main :: IO ()
main = do
putStr "First: "
x <- getNum :: IO (Maybe Double)
putStr "Operation: "
op <- getLine
putStr "Second: "
y <- getNum :: IO (Maybe Double)
if isJust x && isJust y then do
let
x' = fromJust x
y' = fromJust y
putStr "Result: "
case op of
"divide" -> putStrLn $ show $ x' / y'
"sum" -> putStrLn $ show $ x' + y'
_ -> putStrLn "No operation"
else
putStrLn "Invalid numbers"
return ()