Jest to trudniejszy problem niż pożyteczny problem (spędziłem na nim kilka godzin). Biorąc pod uwagę niektóre funkcje,Jak napisać rodzinę funkcji printf (wydruk debugowania itp.) W Haskell
put_debug, put_err :: String -> IO()
put_foo :: String -> StateT [String] m()
Chcę napisać uogólnionej funkcji printf, nazywają to gprint tak, że mogę napisać
pdebug = gprint put_debug
perr = gprint put_err
pfoo = gprint put_foo
a następnie użyć pdebug
, perr
i pfoo
jak printf
, na przykład ,
pdebug "Hi"
pdebug "my value: %d" 1
pdebug "two values: %d, %d" 1 2
Nie uda mi się wymyślić wystarczająco ogólnej klasy. Moje próby były takie rzeczy jak (dla tych, którzy znają Printf
lub zmiennej liczbie argumentów podejścia funkcyjnego Olega)
class PrintfTyp r where
type AppendArg r a :: *
spr :: (String -> a) -> String -> [UPrintf] -> AppendArg r a
lub
class PrintfTyp r where
type KRetTyp r :: *
spr :: (String -> KRetTyp r) -> String -> [UPrintf] -> r
Oba są zbyt trudne do napisania wystąpień bazowe dla: nie ma dobry wybór dla r
w przypadku pierwszego podejścia (i jego typ nie znajduje odzwierciedlenia w rodzinie z indeksem typu iniekcyjnego AppendArg
), aw drugim podejściu kończy się pisanie instance PrintfTyp a
, które wygląda źle (dopasowuje zbyt wiele typów).
Ponownie, to tylko problem z wyzwaniem: rób to tylko wtedy, gdy jest fajnie. Zdecydowanie chciałbym poznać odpowiedź. Dzięki!!
Tak , Chciałem uniknąć terminatorów. Byłbym bardziej zainteresowany poparciem tylko jednego argumentu, tj. Nie popierania sprawy "pdebug" bez argumentów "'. W każdym razie dzięki. – gatoatigrado