Haskell 调用ARPACK++;(一个C+;和#x2B;图书馆)来自哈斯克尔?

Haskell 调用ARPACK++;(一个C+;和#x2B;图书馆)来自哈斯克尔?,haskell,Haskell,我花了几天时间在Haskell开发一个程序,同时学习语言。现在我意识到我需要调用Arpack(FORTRAN库)或ARCPLAC++(一个C++包到ARPACK)——我无法找到一个很好的实现Haskell绑定的Lanczos方法。有没有经验更丰富的Haskell编程人员认为这有多困难 我已经能够通过Ubuntu的存储库安装libarpack和libarpack++的“.so”(“共享对象”)版本,但我不确定这是否足够。我怀疑我最终将需要从源代码构建Arpack++,这是可能的,但我会遇到很多构建

我花了几天时间在Haskell开发一个程序,同时学习语言。现在我意识到我需要调用Arpack(FORTRAN库)或ARCPLAC++(一个C++包到ARPACK)——我无法找到一个很好的实现Haskell绑定的Lanczos方法。有没有经验更丰富的Haskell编程人员认为这有多困难

我已经能够通过Ubuntu的存储库安装libarpack和libarpack++的“.so”(“共享对象”)版本,但我不确定这是否足够。我怀疑我最终将需要从源代码构建Arpack++,这是可能的,但我会遇到很多构建错误,所以这需要时间。有没有办法只使用“.so”文件,而不知道使用了哪个版本的头文件来生成它们

我正在考虑使用绿卡,因为它看起来像是维护最完善的Haskell/C桥。虽然我找不到很多文档,但我想知道它是否也支持C++。p> 我也开始怀疑是否应该用Python重写我的程序,并使用scipy调用Arpack,但我已经花了几天时间编写Haskell。我也很喜欢哈斯克尔,所以我希望我能成功。我想我的总体问题是:与Haskell合作需要什么


非常感谢。

我可以告诉您,在外文函数接口的帮助下,使用Haskell的C/Fortran库肯定是可能的,而且不会太复杂。这是一个例子。在我看来,您应该能够使用C调用约定调用任何东西,甚至Fortran,而无需重新编译代码。唯一的例外是那些看起来像函数调用但实际上是宏的东西,在这种情况下,您必须弄清楚宏的作用并在Haskell中重现它们

从绿卡开始,我从未使用过它,所以我不能担保它


使用Python的第二个想法可能会为您节省几天以上的时间。遗憾的是,我从来没有管理过Haskell代码来轻松地适应我不断变化的需求,而我发现在Python中这是微不足道的。当然,这可能会限制我的Haskell技能或我的思维过程,而不是语言本身

ELF格式是可执行文件和共享库的标准格式,因此访问这些编译模块中的代码只需知道函数名即可。如果我理解正确的话,Fortran就是。因此,Fortran应该可以与任何可以使用C绑定的语言(包括Haskell)进行互操作。仅供参考,您可以使用
nm
工具查找模块导出的所有名称(可执行或共享对象或简单对象存档)(默认情况下,它通常在所有linux发行版中都可用)。如果二进制文件没有被“剥离”,这当然是可行的,但这并不是常见的做法

<> P.>由于H2Kell不能用C++方式绑定,因为C++多态性需要,而且这个名称转换的方法是高度依赖于编译器的。这是一个众所周知的问题,并不是哈斯克尔所特有的。当然,您可以尝试从C++共享对象获取导出符号列表,然后使用FFI绑定它们,但是…这不值得

正如dsign所说,您可以使用外部函数接口GHC特性来创建到外部代码的绑定。您所需要的只是库标题(当然还有库本身)。对于C语言,它可能是头文件(*.h),但由于您的库是用Fortran编写的,因此您必须在库源中找到类似的头文件,参考以匹配Fortran和C类型,然后使用此信息编写FFI绑定。首先编写C绑定(即编写C头)会很有帮助。然后,您甚至可以使用自动FFI绑定程序,如c2hs

<>也许通过C++绑定来帮助你。它可能有我上面描述的头文件。如果它有一个FFI绑定,那么编写FFI绑定并不比为任何其他库编写FFI绑定更困难


因此,这并非完全不可能,但可能需要一些彻底的工作。编写科学/纯计算库的绑定要比为某些系统库编写绑定容易得多,这些系统库需要执行大量IO并保持其自身的内部状态,但由于此库不是用C语言编写的,因此。。。嗯,把时间花在更容易的选择上可能是明智的。关于scipy,我不能说什么,我从未使用过它,但由于Python作为一种语言比Haskell简单得多,它可能是一个不错的选择。

绿卡没有得到很好的维护,上一次黑客上传是在2009年。维护的网桥是
c2hs
hsc2hs
(GHC附带的网桥,不是来自hackage)。如果只调用一个或两个函数,那么直接使用FFI可能是最简单的。没有一个直接支持C++,你必须用C++代码来包装C++函数,以使所有的东西都能工作。“nm”工具列出了名称,所以我至少可以避免编译ARPACK。我会读更多关于外国金融机构的书。如果情况太糟,也许我可以用Haskell编写自己的稀疏矩阵特征值解算器,而不用Fortran库,也不用切换回Python。非常感谢。你可能想读一下Fortran和C的混合。走这条路应该相当简单,除非你可能需要自己写标题。如果您尝试使用arpack++版本,您应该能够通过使用软件包管理器(例如apt get)来安装
libarpack++-dev
来获取标题。由于它们是C++头,它们可能不能直接使用,但它们可以作为起点。