haskell - Haskell 中科学记数法的阅读更方便

标签 haskell scientific-notation

Haskell 的 read 对 float 有点过于严格:

$ ghci
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> read "-1E34" :: Double
-1.0e34
Prelude> read "-1.E34" :: Double
*** Exception: Prelude.read: no parse
Prelude>

是否有接受第二种形式的 read 版本?这在物理科学中很常见。例如,Fortran 可以读取和写入此类形式。

Haskell 不支持的另一个例子是“0.1”的“.1”。这种情况就更常见了。我只是不想转换输入的 ascii 文件。 。 。 .

最佳答案

这是一个执行此操作的自定义解析器,使用 megaparsec .

import Text.Megaparsec
import Text.Megaparsec.Char

realLiteral :: (MonadParsec e s m, Token s ~ Char) => m Double
realLiteral = mkFloat <$> sign <*> intgPart <*> fracPart <*> exponent
 where mkFloat sgn itg frc expn
           = fromIntegral sgn * (fromIntegral itg + frc) * 10^^expn
       sign = (-1) <$ char '-'
           <|> 1   <$ char '+'
           <|> pure 1
       intgPart = read . ('0':) <$> many digitChar
       fracPart = char '.' *> (toFrc<$>many digitChar)
               <|> pure 0
        where toFrc "" = 0
              toFrc digits = read digits / 10^length digits
       exponent = oneOf "eEdD" *> ((*) <$> sign <*> (read<$>some digitChar))
               <|> pure 0
[1 of 1] Compiling Main             ( wtmpf-file5764.hs, interpreted )
Ok, 1 module loaded.
*Main> parseMaybe realLiteral "1"
Just 1.0
*Main> parseMaybe realLiteral "-3"
Just (-3.0)
*Main> parseMaybe realLiteral "-9e+2"
Just (-900.0)
*Main> parseMaybe realLiteral ".3e+9"
Just 3.0e8
*Main> parseMaybe realLiteral "-1.E34"
Just (-1.0000000000000001e34)
*Main> parseMaybe realLiteral "-1.673986e-40"
Just (-1.6739859999999999e-40)
*Main> parseMaybe realLiteral "-3.E+16"
Just (-3.0e16)

关于haskell - Haskell 中科学记数法的阅读更方便,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50078551/

相关文章:

r - 如何在R中仅打印4位数字而不是科学计数法的p值?

已安装但未找到 Haskell 包

haskell - 在计算机科学的背景下,什么是超功能?

python - 一大一小两个整数相除时得到错误答案

c - C 是否具有可以测试值是否在预期值的容差范围内的函数,如果不是,我该如何创建一个函数?

java - 带有 EX、EEX、EXP 或 EE 科学记数法的字符串要加倍

使用 D 代替 E 的 Python 科学记数法

haskell - 如何确定 Haskell 中是否正在内存某个函数?

haskell - 对 (fmap length Just) [1,1,1,1] 与 fmap length $ Just [1,1,1,1] 感到困惑

c# - 混合扩展方法、泛型和 lambda 表达式