Распечатать список поплавков в формате - PullRequest
2 голосов
/ 29 июня 2019

В Haskell, как я могу напечатать список с плавающей точкой (или, скорее, Fractional), а также указать форматирование?Например, putStrLn $ magic "%.2f" [3.14159] должен печатать [3.14].

Как указано здесь есть Text.Printf (printf), но я не понимаю, как использовать его со списками?

Одна вещь, которая «работает» - это

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

с

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

, но это ужасно, должен быть другой путь.

Первые два примера в этот ответ на подобный вопрос вообще не работает.

Ответ здесь достаточно аккуратный, но, как указывалось, не является безопасным для типов, плюс он ломается Read / Show interop.

Есть ли другие альтернативы?Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 июня 2019

Вы можете импортировать числовую библиотеку для достижения этой цели.В качестве примера я быстро написал небольшую программу без использования функции 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"]
3 голосов
/ 29 июня 2019

Вы можете использовать intercalate :: [a] -> [[a]] -> [a], чтобы поместить запятые между элементами, и выполнить дополнительную обработку списка, чтобы добавить '[' впереди и ']' в конец, как:

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...