我有个问题.我写了一个很大的Haskell程序,它始终适用于小输入.现在,当我想测试它并生成更大的输入时,我总是收到消息:
HsProg: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)
我用过Prelude.head很多次了.我该怎么做才能找到更多或获得更好的错误输出以获得它发生的代码行?
我需要知道如何用FFI解决联盟和类型**(例如int**)?我知道我需要一个可存储的结构实例,我也可以将其用于工会吗?
像这样的联盟:
typedef union {
int i;
char c;
} my_union;
Run Code Online (Sandbox Code Playgroud)
这通常在Haskell中表示为:
data MyUnion = I CInt | C CChar
Run Code Online (Sandbox Code Playgroud)
我的问题是你如何编组(定义一个可存储的实例)myUnion进入my_union?我的理解是,一个实例my_union将占用内存中的sizeof(int)字节,即它的最大成员的大小.所以为了存储这个,我们会写下以下内容:
instance Storable myUnion where
size _ = #{size my_union} -- <-- hsc2hs shortcut
alignment _ = alignment undefined::CInt -- <-- What should this really be?
peek ptr = do -- <-- How are you supposed to know which element to extract?
poke ptr (I i) = poke ptr i -- <-- Or should this be #{poke my_union, i} ptr …Run Code Online (Sandbox Code Playgroud)