在Python中,我可以这样做:
import ctypes
import ctypes.util
my_lib = ctypes.cdll.LoadLibrary (ctypes.util.find_library ('my_lib') or 'my_lib32')
a = my_lib.some_function(33)
b = my_lib.some_function2(33)
c = my_lib.SOME_CONST_123
既然我需要将这种类型的Python代码转换成Haskell,我想知道我能在Haskell中做同样的事情吗?我知道我可以通过外国金融机构做类似的事情。 但这并不完全是我在Python中所能做的,因为在Haskell中,我必须首先声明函数,如下所示:
^{pr2}$是真的吗,有更简单的方法吗?在
Python中的ctypes库基本上是C库
libffi
的包装器,这个库让我们在运行时而不是编译时调用进程地址空间中给定信息的任意函数。在same library可以在Haskell中与动态链接器一起使用,以达到相同的效果:
由于很多原因,这并不理想,我不建议构建这样一个大的绑定集,原因与许多Python开发人员不赞成将cype用于绑定一样,除非万不得已。首先,它对每个函数调用都会有一些开销(与ctypes的开销大致相同)。与Haskell的
ccall unsafe
FFI函数相比,has basically no overhead与本机C函数调用一样便宜。在第二,现在函数的参数不是像
Int
和Float
这样的简单Haskell类型的参数,现在都在一个巨大的libffi sum类型Arg
中,这对类型系统是不透明的,并且很容易引入细微的bug。在如果您可以在编译时链接C库并向前声明函数,无论是使用常规的Haskell FFI(
-XForeignFunctionInterface
)和/或c2hs之类的工具,这将使您的工作更加轻松。在相关问题 更多 >
编程相关推荐