我有一個生成 SVG 代碼(影像和圖示)的包
但是,生成的 svg 代碼太大,因為所有數字都有很多小數位。
是否有語言編譯指示或類似的東西可以限制所有數字只有 3 個十進制數字?
我想用一些最少的代碼來做到這一點,我不想將某些功能Float單獨應用于每個數字。
uj5u.com熱心網友回復:
不,您無法更改 IEEE 754 浮點運算的作業方式。無論如何,這種變化可能會比您預期的影響更多。幸運的是,您想要的不是改變浮點數的表示方式,而是它們的呈現方式。因此,您只需更改實際將浮點數寫入輸出檔案的代碼,而不是所有涉及浮點數的代碼。
您在評論中提到您正在使用 blaze-svg 進行渲染。這將有助于包含在問題中,因為它的 API 會影響您可以做什么。我不熟悉那個包,但乍一看它有很多帶有簽名的功能
foo :: Show a => a -> Markup
這是一個有點尷尬的簽名,因為Show a => a它只是一種表示字串的奇怪方式。但這意味著您不能只自己格式化字串然后將其傳入:您必須傳入Show. 當然,String 是 Show,但是如果你給它一個 String,它會呼叫show那個 String,最后用"字符包裝它!大概在您傳入 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
然后,您只需使用 ThreeDigitFloat,而不是使用 Float,庫將按照您的意圖呈現它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517142.html
標籤:哈斯克尔数字ghc
上一篇:Solo如何防止空間泄漏?
下一篇:OCaml中的可執行注釋
