gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:01:10 24 4
gpt4 key购买 nike

我有一个生成 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com