有没有办法链接像这样的函数withCString
?我的意思是任何
函数看起来像f :: Foo -> (CFoo -> IO a) -> IO a
.
例如,假设有一个函数cFunc :: CString -> CFoo -> CBar -> IO ()
通常,我会做类似的事情:
haskellFunc string foo bar =
withCString string $ \ cString ->
withCFoo foo $ \ cFoo ->
withCBar bar $ \ cBar ->
cFunc cString cFoo cBar
但我想做一些类似的事情:
haskellFunc = (withCString |.| withCFoo |.| withCBar) cFunc
使用一些适当的组合运算符|.|
.
我正在编写带有大量 C 绑定的库,这个样板来自
经常。难道我做错了什么?
您可以使用Cont暗示应用 https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-Cont.html为了创作这些a -> (b -> IO c) -> IO c
功能:
import Control.Monad.Cont
haskellFunc :: String -> Foo -> Bar -> IO ()
haskellFunc string foo bar = flip runCont id $
cFunc <$>
cont (withCString string) <*>
cont (withCFoo foo) <*>
cont (withCBar bar)
或者使用一些额外的语法:
haskellFunc' :: String -> Foo -> Bar -> IO ()
haskellFunc' string foo bar = flip runCont id $
cFunc <<$>> withCString string <<*>> withCFoo foo <<*>> withCBar bar
where
f <<$>> x = f <$> cont x
f <<*>> x = f <*> cont x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)