关于Haskell FFI的反馈

MUX*_*CAH 9 f# haskell ffi

我是函数式编程的新手(主要是C++/C#程序员),我即将开始一个新项目.没有严格的期限,此时对可以使用的技术没有限制.

该项目的核心是解析(相对)大型CSV文件并填充Excel和Word模板.我正在考虑两种方法,Qt/C++ - Haskell进行CSV解析,计算等,而C#用于UI,F#正在进行繁重的工作.我想从C++/Haskell开始,因为它更具挑战性.

我主要担心的是Haskell的FFI和州.Haskell FFI在传递大型结构数组和C回调方面有多强大?我是否使用State monad在函数调用Haskell DLL之间的内存中保留大数据集?我是Haskell的新手:)

Dan*_*ner 11

Haskell FFI在传递大型结构数据方面有多强大?

一切都必须在语言障碍上进行整理/解组.使大型数据结构对一种语言或另一种语言不透明是很常见的.也就是说,如果有一个大的C数据结构,只需在Haskell-land中保留一个指向它的指针,然后导入执行所需操作的C函数; 同样,如果有一个大的Haskell数据结构,则暴露Haskell函数,将其转换为C-land.

Haskell FFI对C回调有多强大?

将Haskell闭包转换为C风格的函数指针是很容易和常见的.

我是否使用State monad在函数调用Haskell DLL之间的内存中保留大数据集?

这很大程度上取决于您设计的API.在许多情况下(例如大多数UI库),这实际上是不可行的,因为主循环在C中,而不是Haskell; 一个代替使用IORef或类似.

这就是说:如果这是你的第一个Haskell项目,我强烈建议避免手动FFI工作,特别是尝试通过FFI混合Haskell和C++.有很多困难的东西可以习惯,而不会把它扔进混合物中.如果您计划使用它的唯一内容是UI,那么请利用其他人的辛勤工作:Haskell绑定到Hackage上可用的最大UI工具包.


Tom*_*cek 10

学习Haskell是成为一名优秀的函数式程序员的好方法,因为它教你如何以纯粹的函数方式编写代码 - 这也是其他函数式语言强调的东西,但它们并没有强迫你去做.

也就是说,如果你想与Excel之类的东西进行互操作(这本身就是一个可变的命令式API),那么使用一种不会强迫你变得纯洁的语言可能是解决问题的一种更简单的方法.

目前,为Excel编写代码的大多数人都使用.NET,因此Excel的.NET库(从F#中可以很好地工作)比任何其他平台都要先进得多.

在决定之前,您可能希望查看以下库:

  • NetOffice是一个记录完备的库,它将所有Office API包装在(相当)易于使用的.NET API中,您可以在F#中使用它,而不会出现任何阻抗不匹配.

  • 作为F#Data的一部分的Csv Type Provider不仅仅是一个CSV解析器,而且它还根据您的CSV文件推断出类型,并为您提供对CSV数据结构的类型化访问.

  • 如果你想做一些数据分析,那么Deedle是一个开源数据分析库,用于F#,它由BlueMountain Capital开发并经过了很好的测试 - 并且具有非常简单的API,可以在合理的大小上进行基本的数据分析(但是公平的)大数据集(如果它适合2GB你应该没问题)

听起来像你正在描述的那种项目,你可以通过使用已经存在的.NET/Mono库和F#特定的库来获得很多 - 并且在同一个运行时,你不必担心关于任何FFI.

  • 感谢所有的投入.经过一番研究,我决定用C#/ F#实现这个项目.F#似乎是这项特殊工作的更好工具. (4认同)
  • 你是对的.我不是想回答这个问题,而是提供一个有用的指导.在Excel中使用Haskell进行FFI听起来真的很糟糕. (3认同)
  • "我是新手"可能会建议指导可能会有所帮助 (2认同)