Questo è un problema di sfida più che un problema utile (ho trascorso alcune ore su di esso). Dato alcune funzioni,Come scrivere una famiglia di funzioni printf (debug print, ecc.) In Haskell
put_debug, put_err :: String -> IO()
put_foo :: String -> StateT [String] m()
Voglio scrivere una funzione printf generalizzata, lo chiamano gprint, in modo tale che posso scrivere
pdebug = gprint put_debug
perr = gprint put_err
pfoo = gprint put_foo
e quindi utilizzare pdebug
, perr
, e pfoo
come printf
, per esempio ,
pdebug "Hi"
pdebug "my value: %d" 1
pdebug "two values: %d, %d" 1 2
Non riesco a trovare una classe sufficientemente generale. I miei tentativi sono stati le cose come (per chi ha familiarità con Printf
, o un approccio Funzione Variadica di 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
Entrambi sono troppo difficile da scrivere le istanze di base per: non c'è buona scelta per r
per il primo approccio (e, il suo tipo non si riflette nella famiglia di tipi indicizzati non -injective AppendArg
), e nel secondo approccio, uno finisce per scrivere instance PrintfTyp a
che sembra sbagliato (corrisponde a troppi tipi).
Anche in questo caso, è solo un problema di sfida: farlo solo se è divertente. Sarei sicuramente curioso di sapere la risposta però. Grazie!!
Sì , Volevo evitare i terminatori. Sarei più interessato a supportare un solo argomento, cioè non supportare il caso "pdebug" senza argomenti "". Grazie comunque. – gatoatigrado