[英]Can I restrict numbers to only 3 decimals globally in Haskell?
我有一個 package 生成 SVG 代碼(圖像和圖標)
但是,生成的 svg 代碼太大,因為所有數字都有很多小數位。
是否有語言編譯指示或類似的東西可以限制所有數字只有 3 位小數?
我想用一些最少的代碼來做到這一點,我不想將一些 function 分別應用於每個Float
。
不,您不能更改 IEEE 754 浮點運算的工作方式。 無論如何,這種變化的影響可能會比您預期的要大得多。 幸運的是,您想要的不是改變浮點數的表示方式,而是它們的呈現方式。 所以你只需要將真正寫入float的代碼改成output文件,而不是所有接觸float的代碼。
您在評論中提到您正在使用 blaze-svg 進行渲染。 這將有助於包含在問題中,因為它的 API 會影響您可以做什么。 那個package我不熟悉,但一眼看去它有很多功能和簽名
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,庫將按照您的意願呈現它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.