这是一个挑战问题,而不是一个有用的问题(我花了几个小时)。鉴于一些功能,如何在Haskell中编写一系列printf函数(调试打印等)
put_debug, put_err :: String -> IO()
put_foo :: String -> StateT [String] m()
我想写一个广义的printf函数,调用它GPRINT,这样我可以写
pdebug = gprint put_debug
perr = gprint put_err
pfoo = gprint put_foo
然后用pdebug
,perr
和pfoo
像printf
,例如,
pdebug "Hi"
pdebug "my value: %d" 1
pdebug "two values: %d, %d" 1 2
我无法想出一个足够一般的班级。我尝试过的事情一样(对于熟悉Printf
,或Oleg的可变参数函数的方法)
class PrintfTyp r where
type AppendArg r a :: *
spr :: (String -> a) -> String -> [UPrintf] -> AppendArg r a
或
class PrintfTyp r where
type KRetTyp r :: *
spr :: (String -> KRetTyp r) -> String -> [UPrintf] -> r
两者都太难写基地的实例为:有没有好的选择。r
对于第一种方法(并且,其类型不反映在非内射索引类型家族AppendArg
中),并且在第二种方法中,最终写入instance PrintfTyp a
,其看起来不正确(匹配太多类型)。
同样,这只是一个挑战问题:只有在它很有趣的时候才会这样做。尽管如此,我一定会好奇地知道答案。谢谢!!
呀,我想避免终结者。我更感兴趣的是只支持一个参数,即不支持'pdebug“无参数”''的情况。不过谢谢。 – gatoatigrado 2012-03-05 18:46:56