gpt4 book ai didi

haskell - 如何为此类型创建可存储实例?

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

假设我有以下 C 结构:

typedef struct _Ready {
int ready;
} *Ready;

我使用这种类型在 Haskell 中表示它:

data Ready = Ready { ready :: CInt }

现在我想要一个 Storable 实例。以下工作正常:

instance Storable Ready where
alignment = sizeOf
sizeOf _ = (#size Ready)

但是,添加 peekpoke 的任何定义都会失败:

    peek p = Ready <$> (#peek Ready, ready) p   -- FAILS
poke p (Ready r) = (#poke Ready, ready) p r -- FAILS

错误归结为ready不是结构或联合的一部分:

/usr/lib/ghc-7.10.1/template-hsc.h:72:24:
error: request for member ‘ready’ in something not a structure or union

我做错了什么?

谢谢!

最佳答案

Ready(C 类型)不是结构体或联合,它是指向 struct _Ready 的指针。您应该使用 struct _Ready 代替,例如

peek p = Ready <$> (#peek struct _Ready, ready) p
poke p (Ready r) = (#poke struct _Ready, ready) p r

此外,您的 sizeOf 方法是错误的,需要进行相同的更改。您需要结构体的大小,但当前您拥有指向该结构体的指针的大小,并且它们在 64 位系统上通常不相同。

关于haskell - 如何为此类型创建可存储实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29733762/

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