5

次のようなロガー関数を定義したいと思います

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からも入手できます。

4

1 に答える 1