Parsing 检查字符串中的价格值的格式是否正确
如果输入始终有效或异常正常,则使用n 如果用户以“123.456”的形式输入十进制数,则可以使用Parsing 检查字符串中的价格值的格式是否正确,parsing,haskell,Parsing,Haskell,如果输入始终有效或异常正常,则使用n 如果用户以“123.456”的形式输入十进制数,则可以使用read将其转换为浮点或双精度: n <- getLine let val = read n n <- liftM read getLine 捕捉错误输入 如果用户输入无效条目,上述代码将失败,并出现异常。如果这是一个问题,那么使用reads和列表可以(来自数据。可能): 如果输入始终有效或异常正常 如果用户以“123.456”的形式输入十进制数,则可以使用read将其转换为浮点或双精
read
将其转换为浮点或双精度:
n <- getLine
let val = read n
n <- liftM read getLine
捕捉错误输入
如果用户输入无效条目,上述代码将失败,并出现异常。如果这是一个问题,那么使用reads和列表可以
(来自数据。可能
):
如果输入始终有效或异常正常 如果用户以“123.456”的形式输入十进制数,则可以使用
read
将其转换为浮点或双精度:
n <- getLine
let val = read n
n <- liftM read getLine
捕捉错误输入
如果用户输入无效条目,上述代码将失败,并出现异常。如果这是一个问题,那么使用reads和列表可以
(来自数据。可能
):
除了TomMD提供的解析建议之外,考虑使用适当的Maad进行错误报告。它允许您方便地链接可能失败的计算,避免在每个步骤上进行显式错误检查
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.Error
parsePrice :: MonadError String m => String -> m Double
parsePrice s = do
x <- case reads s of
[(x, "")] -> return x
_ -> throwError "Not a valid real number."
when (x <= 0) $ throwError "Price must be positive."
return x
main = do
n <- getLine
case parsePrice n of
Left err -> putStrLn err
Right x -> putStrLn $ "Price is " ++ show x
{-#语言灵活上下文}
导入控制.Monad.Error
parsePrice::MonadError字符串m=>String->m Double
parses=do
返回x
_->throwError“不是有效的实数。”
当(x putStrLn$”价格为“++显示x
< /代码> 除了TomMD提供的解析建议之外,考虑使用适当的单元格进行错误报告。它允许您方便地进行可能失败的链计算,避免每一步的显式错误检查。
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.Error
parsePrice :: MonadError String m => String -> m Double
parsePrice s = do
x <- case reads s of
[(x, "")] -> return x
_ -> throwError "Not a valid real number."
when (x <= 0) $ throwError "Price must be positive."
return x
main = do
n <- getLine
case parsePrice n of
Left err -> putStrLn err
Right x -> putStrLn $ "Price is " ++ show x
{-#语言灵活上下文}
导入控制.Monad.Error
parsePrice::MonadError字符串m=>String->m Double
parses=do
返回x
_->throwError“不是有效的实数。”
当(x putStrLn$”价格为“++显示x
hmm我不建议将价格存储到Double
变量中。是的,除非您想处理舍入错误,否则价格应该是整数。请注意(v,):u)
模式将接受带有尾随垃圾的输入,如“23.99foobar”。显然,需要将对中的第二个元素与[]<或代码>以避免这种混淆的行为。好的答案。或者也许考虑<代码>数据。固定的< /代码>用于固定的精确性。但是我希望返回true的函数是Value是Falue或false,如果不是。HMM,我不建议把价格存储到<代码>双变量。是的,价格应该是整数,除非你想处理舍入。请注意,(v,-)
模式将接受带有尾随垃圾的输入,如“23.99foobar”。显然,需要将该对中的第二个元素与[]
匹配,以避免这种混淆行为。回答得好。但是,我想让函数返回true,值是浮点数或者false,如果不是的话,但是我希望返回true的函数是Value是Falue还是false,如果不是的话,但是我希望返回true的函数是Value是Falue还是false如果不是。可能重复的
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.Error
parsePrice :: MonadError String m => String -> m Double
parsePrice s = do
x <- case reads s of
[(x, "")] -> return x
_ -> throwError "Not a valid real number."
when (x <= 0) $ throwError "Price must be positive."
return x
main = do
n <- getLine
case parsePrice n of
Left err -> putStrLn err
Right x -> putStrLn $ "Price is " ++ show x