我是函数式编程的新手(主要是C ++ / C#程序员),我即将开始一个新项目。没有严格的期限,此时对可以使用的技术没有限制。
该项目的核心是解析(相对)大型CSV文件并填充Excel和Word模板。我正在考虑两种方法,Qt / C ++ - Haskell进行CSV解析,计算等,而C#用于UI,F#正在进行繁重的工作。我想从C ++ / Haskell开始,因为它更具挑战性。
我主要担心的是Haskell中的FFI和状态。 Haskell FFI在传递大型结构数组和C回调方面有多强大? 我是否使用State monad在函数调用Haskell DLL之间的内存中保留大数据集?我是Haskell的新手:)
答案 0 :(得分: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工具包。
答案 1 :(得分:10)
学习Haskell是一个很好的方法,可以成为一名优秀的函数式程序员,因为它教你如何以纯粹的函数方式编写代码 - 这也是其他函数式语言强调的东西,但它们并没有强迫你去做。 / p>
也就是说,如果你想与Excel之类的东西进行互操作(这本身就是一个可变的命令式API),那么使用一种不会强迫你变得纯洁的语言可能是解决问题的一种更简单的方法。
目前,为Excel编写代码的大多数人都使用.NET,因此Excel的.NET库(从F#中运行良好)比任何其他平台都要先进得多。
在决定之前,您可能需要查看以下库:
NetOffice是一个记录完备的库,将所有Office API包装在(相当)易于使用的.NET API中,您可以在F#中使用它,而不会出现任何阻抗不匹配。
Csv Type Provider这是F#Data的一部分,它不仅仅是一个CSV解析器,还可以根据您的CSV文件推断出类型,并为您提供对CSV数据结构的类型化访问。
如果您想进行一些数据分析,那么Deedle是一个开源数据分析库,适用于由BlueMountain Capital开发的F#,并且经过了很好的测试 - 并且具有非常简单的API对合理大小(但相当大)的数据集进行基本数据分析(如果它适合2GB,你应该没问题)
听起来像你正在描述的那种项目,你可以通过使用已经存在的.NET / Mono库和F#特定的库来获得很多 - 并且在同一个运行时,你不会不得不担心任何FFI。