gpt4 book ai didi

haskell - 访问 C2HS 编码功能的现代方法是什么?

转载 作者:行者123 更新时间:2023-12-02 21:20:56 25 4
gpt4 key购买 nike

我想使用cFromEnum函数,但它驻留在C2HS模块中,我被告知这是不必要的,不应该解压/安装(c2hs not getting installed / registered correctly )。转换枚举的现代方法是什么?为了具体起见,这是我的代码。

{# enum BNType {underscoreToCase} deriving (Show, Eq) #}
{# pointer *NodeVector newtype #}
{# fun get_nodes_by_type { cFromEnum `BNType' } -> `NodeVector' id #}

(get_nodes_by_type 最终会接受一个参数;我现在只是想让一些东西起作用)。

最佳答案

AFAICT,此时 c2hs 用户需要编写自己的编码函数。不幸的是,编码器必须是名称,而不是任意表达式,因此您不能使用 fromIntegral 。 fromEnum 作为 c2hs 声明中的编码器。

目前,我自己编写编码器并将它们包含在 .c2hs 文件中。以下是我的一个更复杂的绑定(bind)中的一些编码器。我发现 withObject 的情况特别令人烦恼,但还没有严重到我已经尝试自己修复它的程度。

cIntToEnum :: Enum a => CInt -> a
cIntToEnum = toEnum . fromIntegral

cIntFromEnum :: Enum a => a -> CInt
cIntFromEnum = fromIntegral . fromEnum

cIntConv :: (Integral a, Num b) => a -> b
cIntConv = fromIntegral

cFloatConv :: (Real a, Fractional b) => a -> b
cFloatConv = realToFrac

-- |since c2hs doesn't allow "with" as an input marshaller,
-- withObject is a synonym.
withObject :: Storable a => a -> (Ptr a -> IO b) -> IO b
withObject = with

withFloatArray :: (Storable b, RealFloat b, RealFloat a) =>
[a]
-> (Ptr b -> IO b1)
-> IO b1
withFloatArray = withArray . map (cFloatConv)

可以说,其中许多内容应该被提取并放入一个公共(public)库中。如果它与 c2hs 软件包捆绑在一起,那就完美了(恕我直言,C2HS 模块被过早删除了)。

关于haskell - 访问 C2HS 编码功能的现代方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9471902/

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