haskell - 我可以在 Haskell 中将数字全局限制为只有 3 位小数吗?

标签 haskell numbers ghc

我有一个生成 SVG 代码(图像和图标)的包

但是,生成的 svg 代码太大,因为所有数字都有很多小数位。

是否有语言编译指示或类似的东西可以限制所有数字只有 3 位小数?

我想用一些最少的代码来做到这一点,我不想将某些功能单独应用于每个 Float 数字。

最佳答案

不,您不能更改 IEEE 754 浮点运算的工作方式。无论如何,这种变化的影响可能会比您预期的要大得多。幸运的是,您想要的不是改变 float 的表示方式,而是它们的呈现方式。因此,您只需更改实际将 float 写入输出文件的代码,而不是所有涉及 float 的代码。

您在评论中提到您正在使用 blaze-svg 进行渲染。这将有助于包含在问题中,因为它的 API 会影响您可以做什么。那个包我不熟悉,但一眼看去它有一大堆函数和签名

foo :: Show a => a -> Markup

这是一个有点笨拙的签名,因为 Show a => a 只是一种表示字符串的奇怪方式。但这意味着您不能自己格式化字符串然后将其传入:您必须传入 Show 的内容。当然,String 是 Show,但是如果你给它一个 String,它会在那个 String 上调用 show,并最终用 " 字符包装它!大概是现在您正在传递 Float 值,而库正在呈现它们。您想要的是一种行为类似于 Float 但具有不同 Show 实现的类型。这就是新类型的用途:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype ThreeDigitFloat = TDF Float
  -- cut any of these you don't need
  deriving (Num, Eq, Ord, Floating, RealFloat, Fractional, Real, RealFrac)

instance Show ThreeDigitFloat where
  show (TDF x) = _whateverYouWant

然后您无需使用 Float,只需使用 ThreeDigitFloat,该库将按照您的意图呈现它们。

关于haskell - 我可以在 Haskell 中将数字全局限制为只有 3 位小数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73954239/

相关文章:

c++ - 样条拟合 - Douglas-Peucker 算法

PHP round() 没有按预期四舍五入到两个位置

macos - 使用部署目标构建 Haskell macOS 可执行文件

haskell - 为什么 Int 不可升级?

haskell - 为什么这个 Haskell 过滤器会终止?

haskell - 将 [Int] 转换为 [Word8]

string - 如何在 haskell 中正确定义空字符串?

Haskell 预防泛型函数超出范围

javascript - 这里如何使用扩展语法将数字转换为字符串数组?

bash - 在 bash 中进行数值测试的方法有哪些?