Parsing 检查字符串中的价格值的格式是否正确

Parsing 检查字符串中的价格值的格式是否正确,parsing,haskell,Parsing,Haskell,如果输入始终有效或异常正常,则使用n 如果用户以“123.456”的形式输入十进制数,则可以使用read将其转换为浮点或双精度: n <- getLine let val = read n n <- liftM read getLine 捕捉错误输入 如果用户输入无效条目,上述代码将失败,并出现异常。如果这是一个问题,那么使用reads和列表可以(来自数据。可能): 如果输入始终有效或异常正常 如果用户以“123.456”的形式输入十进制数,则可以使用read将其转换为浮点或双精

如果输入始终有效或异常正常,则使用n

如果用户以“123.456”的形式输入十进制数,则可以使用
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