gpt4 book ai didi

haskell - 有没有办法像 withCString 这样链接函数?

转载 作者:行者123 更新时间:2023-12-04 00:34:47 25 4
gpt4 key购买 nike

有没有办法像 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 绑定(bind)的库,而这个样板文件来了
经常。难道我做错了什么?

最佳答案

您可以使用 Cont inuation applicative组成这些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

关于haskell - 有没有办法像 withCString 这样链接函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37379984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com