これは便利な問題以上の難題です(私は数時間を費やしました)。いくつかの機能、私は一般printf関数を書きたいHaskellでprintf関数のファミリを書く方法(デバッグプリントなど)
put_debug, put_err :: String -> IO()
put_foo :: String -> StateT [String] m()
を考えると、私は
pdebug = gprint put_debug
perr = gprint put_err
pfoo = gprint put_foo
を書き、その後、例えば、printf
ようpdebug
、perr
、およびpfoo
を使用することができるように、それはgprint呼び出します、
pdebug "Hi"
pdebug "my value: %d" 1
pdebug "two values: %d, %d" 1 2
私は十分に一般的なクラスを考え出すことができません。私の試みは(Printf
に精通している人のために、またはオレグの可変引数関数アプローチ)のようなもの
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
のためにありません第2のアプローチでは、instance PrintfTyp a
のように見えてしまいます(タイプが多すぎます)。
もう一度、これは単なる挑戦の問題です:楽しいときにだけそれをしてください。私は間違いなく答えを知りたいと思うだろう。ありがとう!!
うんターミネーターを避けたかったのです。私は、1つの引数だけをサポートすることにもっと興味があるでしょう。すなわち、 'pdebug"という引数がない場合をサポートしていません。しかし、ありがとう。 – gatoatigrado