用Haskell的Parsec解析浮点数

问题描述 投票:1回答:1

有一些代码用于对计算器输入(整数和浮点输入)进行解析:

import Text.Parsec hiding(digit)
import Data.Functor

type Parser a = Parsec String () a

digit :: Parser Char
digit = oneOf ['0'..'9']

fp_char :: Parser Char
fp_char = oneOf ['.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

number :: Parser Integer 
number = read <$> many1 digit

fp_number :: Parser Double
fp_number = read <$> many1 fp_char

addition :: Parser Integer
addition = do
    lhv <- number
    spaces
    char '+'
    spaces
    rhv <- number
    return $ lhv + rhv

fp_addition :: Parser Double
fp_addition = do
    lhv <- fp_number
    spaces
    char '+'
    spaces
    rhv <- fp_number
    return $ lhv + rhv

显然,一旦浮点数输入在'之前或之后,将引发异常。在点字符之前/之后没有任何数字。如何限制字符串评估以防止执行失败?

haskell parsec
1个回答
1
投票
fp_number  :: Parsec String () Double
fp_number  = read <$> parser  where 
   parser = (++) <$> number <*> (option "" $ (:) <$> char '.'  <*> number )

旁注,也不要忘记处理负数。

type Parser a = Parsec String () a

digit :: Parser Char
digit = -- same 

number :: Parser String 
number =  many1 digit

fp_number  :: Parser  Double
fp_number  = read <$> parser  where 
   parser = (++) <$> number <*> (option "" $ (:) <$> char '.'  <*> number )

fp_addition :: Parser Double
fp_addition = --same

test = parseTest fp_addition "2.123 + 213.12"
© www.soinside.com 2019 - 2024. All rights reserved.