簡體   English   中英

我可以在 Haskell 中將數字限制為全局只有 3 位小數嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM