为什么没有Rational的printf格式化程序?

时间:2018-08-08 21:09:15

标签: haskell

可以使用Rationalprintf%s输出中简单地包含show

> printf "... %s ...\n" (show $ 123 % 456)
... 41 % 152 ...

但是,也可以使用%f格式的代码会很有用:

> printf "... %.30f ...\n" (123 % 456)
... 0.269736842105263157894736842105 ...

请注意,通过转换为Double进行格式化(例如,使用fromRational)将不允许我正在寻找的任意精度:

> printf "... %.30f ...\n" (fromRational $ 123 % 456)
... 0.269736842105263160000000000000 ...

%v代码可用于产生与show相同的输出,并且也许可以使用一些修饰符。

有什么理由不应该使用自定义格式化程序(PrintfArg (Ratio a)的实例)来完成此操作吗?

作为参考,这是一个我用作部分解决方法的独立功能:

showDecimal :: RealFrac a => Int -> a -> String
showDecimal n r = printf "%d.%0*d" (i :: Integer) n (abs d :: Integer)
  where (i, d) = (round $ r * 10^n) `quotRem` (10^n)

> printf "... %35s ...\n" (showDecimal 30 $ 123 % 456)
...    0.269736842105263157894736842105 ...

但是,这不允许使用修饰符,并且需要在单独的位置指定宽度。

1 个答案:

答案 0 :(得分:1)

评论中的共识似乎是,因为没有人写一个,这似乎是个好主意

我正在回答自己的问题,因此可以将其标记为已回答。如果我或其他任何人可以实施它,我会添加评论。