如何在Haskell中将小数分解为Rational?

Rot*_*sor 10 parsing haskell decimal rational-numbers

我一直在参加一个编程竞赛,其中一个问题的输入数据包括十进制格式的小数:0.75就是一个例子.

解析它Double是微不足道的(我可以用read它),但精度的损失是痛苦的.人们需要非常小心地进行Double比较(我没有),这似乎是多余的,因为Rational在Haskell中有一个数据类型.

当试图使用它时,我发现read一个Rational人必须提供以下格式的字符串:numerator % denominator,我显然没有.

所以,问题是:

解析分数的十进制表示形式的最简单方法是什么Rational

还应考虑外部依赖项的数量,因为我无法在在线评判中安装其他库.

Yit*_*itz 18

你想要的功能是Numeric.readFloat:

Numeric Data.Ratio> fst . head $ readFloat "0.75" :: Rational
3 % 4
Run Code Online (Sandbox Code Playgroud)

  • 如果你想能够读取负数,你可能想要添加`readSigned`:`fst.head $ readSigned readFloat"-3.14":: Rational` (7认同)