打印格式为

时间:2019-06-29 18:35:27

标签: haskell printf

在Haskell中,如何打印浮点列表(或Fractional)并指定格式?例如。 putStrLn $ magic "%.2f" [3.14159]应打印[3.14]

正如here指出的那样,有Text.Printf (printf),但我不知道如何将其与列表一起使用?

“行之有效”的一件事是

printf' :: [Double] -> [String]
printf' l = map (\x -> printf "%.2f" x) l

使用

main = do
  putStrLn $ show (printf' [3.14159])

但这很可怕,必须有另一种方式。

this answer中针对类似问题的前两个示例根本不起作用。

答案here足够整洁,但正如指出的那样,它不是类型安全的,而且会中断Read / Show互操作。

还有其他选择吗?谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用intercalate :: [a] -> [[a]] -> [a]在元素之间加上逗号,并进行一些附加的列表处理,以在前面添加'[',在末尾添加']',例如:< / p>

import Data.List(intercalate)

main :: IO ()
main = putStrLn ('[' : intercalate "," (printf' [3.14159]) ++ "]")

然后产生:

Prelude Text.Printf Data.List> main
[3.14]

请注意,您可以将printf'简化为:

printf' :: [Double] -> [String]
printf' = map (printf "%.2f")

答案 1 :(得分:3)

您可以导入数值库来实现此目的。我已经快速编写了一个小程序作为示例,而没有使用printf函数。

module Main where

import Numeric

main :: IO ()
main = putStrLn "hello world"

a = [1.111, 2.2222222222222, 3.33333333333333333333333]

printList :: [Double] -> [String]
printList xs = map format xs

format :: Double -> String
format x = showFFloat (Just 2) x ""

简单调用printList a将导致:

["1.11","2.22","3.33"]