Este es un problema de desafío más que un problema útil (he pasado unas horas en él). Teniendo en cuenta que algunas funciones,Cómo escribir una familia de funciones de impresión (impresión de depuración, etc.) en Haskell
put_debug, put_err :: String -> IO()
put_foo :: String -> StateT [String] m()
Quiero escribir una función printf generalizada, lo llaman GPRINT, de modo que puedo escribir
pdebug = gprint put_debug
perr = gprint put_err
pfoo = gprint put_foo
y luego usar pdebug
, perr
y pfoo
como printf
, por ejemplo, ,
pdebug "Hi"
pdebug "my value: %d" 1
pdebug "two values: %d, %d" 1 2
No puedo lograr una clase suficientemente general. Mis intentos han sido cosas como (para quienes están familiarizados con Printf
, o enfoque de la función variadic de Oleg)
class PrintfTyp r where
type AppendArg r a :: *
spr :: (String -> a) -> String -> [UPrintf] -> AppendArg r a
o
class PrintfTyp r where
type KRetTyp r :: *
spr :: (String -> KRetTyp r) -> String -> [UPrintf] -> r
Ambos son demasiado difíciles de escribir instancias de base para: no hay una buena opción para r
para el primer enfoque (y su tipo no se refleja en la familia AppendArg
del tipo indexado no inyectado), y en el segundo enfoque, uno termina escribiendo instance PrintfTyp a
que parece incorrecto (coincide con demasiados tipos).
De nuevo, es solo un problema: hazlo solo si es divertido. Sin embargo, definitivamente tendría curiosidad por saber la respuesta. ¡¡Gracias!!
Sí , Quería evitar los terminadores. Estaría más interesado en solo apoyar un argumento, es decir, no apoyar el caso 'pdebug '' no argumentos ''. Gracias sin embargo. – gatoatigrado