Una alternativa segura de tipo a Text.Printf
es la formatting p Ackage. Text.Printf.printf
no garantiza en tiempo de compilación que el número de parámetros de formato se alinee con la cantidad de argumentos y sus tipos. Lea el artículo de Chris Done, What's wrong with printf? para ver ejemplos.
Un ejemplo de uso:
{-# 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), ...]
Se requiere la extensión GHC OverloadedStrings para funcionar correctamente.
Mientras que formatToString ("Value: " % int % " " % int)
tiene el tipo , al desagrupar da el tipo (Int, Int) -> String
cuyo tipo de entrada coincide con los elementos de la lista.
El proceso de reescritura se puede desglosar; suponiendo f
= formatString ("Value: " ...)
,
map (\(x,y) -> f x y) ≡ map (\(x,y) -> uncurry f (x,y)) ≡ map (uncurry f)
Esto es, primero que f uncurry para lograr la función que acepta tuplas, y luego realizar un habitual Eta-conversion desde \(x,y) -> uncurry f (x,y)
es equivalente a simplemente uncurry f
. Para imprimir cada línea en el resultado, utilice mapM_
:
mapM_ (putStrLn . uncurry $ formatToString ...) [(1,100), (2,350), ...]
Si ejecuta YourFile.hs hlint, estas reescrituras serán recomendados para usted.
relacionado http://stackoverflow.com/q/6237259/168034 – phunehehe