Existe uma maneira de encadear funções como withCString?

Existe uma maneira de encadear funções comowithCString? Com isso, quero dizer qualquer função que se pareça com algof :: Foo -> (CFoo -> IO a) -> IO a.

Por exemplo, digamos que há uma funçãocFunc :: CString -> CFoo -> CBar -> IO ()

Normalmente, eu faria algo como:

haskellFunc string foo bar =
  withCString string $ \ cString ->
    withCFoo foo $ \ cFoo ->
      withCBar bar $ \ cBar ->
        cFunc cString cFoo cBar

Mas eu gostaria de fazer algo como:

haskellFunc = (withCString |.| withCFoo |.| withCBar) cFunc

com algum operador de composição apropriado|.|.

Estou escrevendo uma biblioteca com muitas ligações C, e esse texto padrão vem com frequência. Estou fazendo algo errado?