Безопасной альтернативой Text.Printf
является пакет для форматирования . Text.Printf.printf
не гарантирует, что во время компиляции количество параметров форматирования совпадает с количеством аргументов и их типов. Прочитайте статью Криса Донца, Что не так с printf? для примеров.
Пример использования:
{-# LANGUAGE OverloadedStrings #-}
import Formatting
map (uncurry $ formatToString ("Value: " % int % " " % int)) [(1,100), (2,350), ...]
map (\(x,y) -> formatToString ("Value: " % int % " " % int) x y) [(1,100), (2,350), ...]
Для правильной работы требуется расширение GHC OverloadedStrings .
Несмотря на то, что formatToString ("Value: " % int % " " % int)
имеет тип Int -> Int -> String
, при невыполнении он дает тип (Int, Int) -> String
, тип ввода которого соответствует элементам в списке.
Процесс переписывания может быть разбит; при условии f
= formatString ("Value: " ...)
,
map (\(x,y) -> f x y) ≡ map (\(x,y) -> uncurry f (x,y)) ≡ map (uncurry f)
То есть сначала вы не спешите f для достижения функции, которая принимает кортежи, а затем выполняете обычное Eta-преобразование , поскольку \(x,y) -> uncurry f (x,y)
эквивалентно просто uncurry f
. Чтобы напечатать каждую строку в результате, используйте mapM_
:
mapM_ (putStrLn . uncurry $ formatToString ...) [(1,100), (2,350), ...]
Если вы запустите hlint YourFile.hs , вам будут рекомендованы эти изменения.