【问题标题】:How to Parse a floating number in Haskell (Parsec.Combinator)如何在 Haskell 中解析浮点数(Parsec.Combinator)
【发布时间】:2025-12-17 07:20:04
【问题描述】:

我正在尝试使用 Parsec.Combinator 库解析 haskell 中的字符串。但我找不到如何解析浮点值。我的函数只读取整数(带数字,但数字只解析整数值)。

parsePoint :: Parser Point
parsePoint = do
              string "Point"
              x <- many1 digit
              char ','
              y <- many1 digit
              return $ (Point (read x) (read y))

我搜索了 Text.Parsec.Number 库,但没有找到如何使用的示例。

感谢阅读

【问题讨论】:

  • 有几种浮点解析器:hackage.haskell.org/package/parsec3-numbers-0.1.0/docs/…,具体取决于您要允许的格式。
  • 是的,我看到了那个库,但我没有找到任何使用示例
  • 它是Parsec s u m f类型,所以它可以用于任何Parsec类型,Floating fStream s m Char。根据您使用的确切Parser(取决于您使用的Parsec 的哪个模块),它将专门解析TextByteStrings 等。

标签: parsing haskell parsec


【解决方案1】:

有几个Parsers 可以解析浮点数,例如floating :: (Floating f, Stream s m Char) =&gt; ParsecT s u m fParser 只是 Parsec 特殊情况的别名,具体取决于您使用的模块。例如type Parser = Parsec Text ()

如果您的Point 因此接受例如两个Floats,您可以使用parsec3-numbers package 并使用:

import Text.Parsec.Char(char, string)
import Text.Parsec.Number(floating)
import Text.Parsec.Text(Parser)

data Point = Point Float Float

parsePoint :: Parser Point
parsePoint = do
              string "Point "
              x <- floating
              char ','
              y <- floating
              return (Point x y)

然后可以解析,在本例中为字符串"Point 3.14,2.718"

【讨论】: