我有一个关于Haskell C FFI的问题,特别是关于访问由C库导出的静态数据结构.
我正在包装的C库具有FOO_GEORGE如下所示的静态数据结构,以下列方式导出:
static struct foo_struct foo_table[] = { /* list of foo structs */ }
typedef struct foo_struct *foo_t;
foo_t FOO_GEORGE = &foo_table[0];
foo_t FOO_HARRY = &foo_table[1];
foo_t FOO_SUSAN = &foo_table[2];
/* ... */
Run Code Online (Sandbox Code Playgroud)
我在Haskell库中需要的值是foo_struct(&foo_table[n])的地址,即内容FOO_GEORGE,以通常的方式放入不透明的newtype包装器中(构造函数不是从库中导出的,只是类型):
newtype Foo = Foo { getFoo :: (Ptr Foo) }
Run Code Online (Sandbox Code Playgroud)
这就是我现在正在做的事情:
foreign import ccall "&FOO_GEORGE" fooGeorgeHandle :: Ptr (Ptr Foo)
FooGeorge = Foo . unsafeDupablePerformIO . peek $ fooGeorgeHandle
Run Code Online (Sandbox Code Playgroud)
我认为这是一个合适的用途unsafePerformIO,因为C API和实现说这种用法peek是纯粹的并且没有副作用.另外,我认为我不需要采取 …
这必须是一个常见问题解答,但我无法在暴风雪中找到关于letvs 的问题where,所以...我想用多个顶级绑定来表示一个表达式,而将它仅限于那些绑定.如果我有一个带有"where"子句的单个绑定,我可以这样做:
foo = ... bar ... bar ...
where bar = ...
Run Code Online (Sandbox Code Playgroud)
如果我有相同顶级绑定的多个保护方程式:
foo = x | ... bar ...
| ... bar ...
where bar = ...
Run Code Online (Sandbox Code Playgroud)
但似乎没有办法在"where"的范围内有多个顶级绑定,这是这样的:
foo = ... bar ...
baz = ... bar ...
where bar = ...
Run Code Online (Sandbox Code Playgroud)
我也必须bar在顶层定义.这不是什么大问题,但更贴近它的范围会更好.我错过了什么吗?谢谢!