次のようなロガー関数を定義したいと思います
myPutStrLn = putStrLn . (++) "log: "
main = do myPutStrLn "hello"
これは問題ありません。printf
今、私は提供された文字列を次のようにフォーマットしたいと思います
myPutStrLn $ printf "test %d" (23 :: Int)
すごい!printf
私はこのパターンを非常に頻繁に持っているので、ロガー関数を考慮したいと思います:
myPrintf = logger . printf
where
-- note, this is just an example. should be
-- replaceable with any function with this
-- typesignature
logger :: String -> IO ()
logger = putStrLn . (++) "log: "
main = myPrintf "test %d" (23 :: Int)
残念ながら、これは失敗します
The function `myPrintf' is applied to two arguments,
but its type `String -> IO ()' has only one
In a stmt of a 'do' block: myPrintf "test %d" (23 :: Int)
In the expression: do { myPrintf "test %d" (23 :: Int) }
In an equation for `main':
main = do { myPrintf "test %d" (23 :: Int) }
GHC は を推論myPrintf :: String -> IO ()
するので、明らかに何か問題があります。Polyvariadic compositionについて何かを見つけましたが、これを私の問題に適用することはできません。それが私の問題を解決するかどうかさえわかりません。
コードはgistからも入手できます。