Haskell FFI 反馈

9

我是一个C++ / C#程序员,对函数式编程比较陌生,并且即将开始一个新项目。目前没有严格的截止日期,也没有限制使用哪些技术。

该项目的核心是解析(相对)大型CSV文件并填充Excel和Word模板。我正在考虑两种方法,Qt / C ++ - Haskell用于CSV解析、计算等,C#用于UI,F#用于重量级处理。我想从C++/Haskell开始,因为这更具有挑战性。

我的主要关注点是Haskell中的FFI和状态。 Haskell FFI在传递大型结构数组和C回调方面有多强大? 我是否应该使用State Monad在Haskell DLL的函数调用之间保留大型数据集的内存?我对Haskell不太熟悉 :)


你为什么想要使用Haskell?这似乎只会增加系统的复杂性,没有任何理由(并不是说它没有用处,只是在这种情况下似乎没有明确的理由)。 - N_A
我花了最近的2-3个月时间阅读了两本Haskell书籍,现在我想把这些知识应用起来。这是一个副业项目。 - MUXCAH
1
10年前,最可行的选择是使用Haskell + GreenCard来编写Excel和Word的COM脚本。不幸的是,随着其创建者离开,GreenCard已经陈旧过时。我知道有人后来重新启用了它,但我不确定它现在是否用户友好。由于Excel可以从.Net进行脚本编写,这些天我认为F#在Haskell上具有相当大的优势。然而,Haskell的一个可能的路线是集中于将CSV -> CSV转换,并使用一点F#甚至VBA进行最后一步操作。 - stephen tetley
1
我不太担心这个,Qt 可以很好地处理 MS Office。 - MUXCAH
2个回答

11
Haskell FFI在传递大型结构体数组方面有多强大?所有内容都必须在语言屏障处进行编组/解编。将大数据结构保持为一种语言或另一种语言的不透明结构很常见。即,如果有一个大的C数据结构,在Haskell中只需保留指向它的指针,并导入执行所需操作的C函数;同样,如果有一个大的Haskell数据结构,将可以改变它的Haskell函数暴露给C层。

Haskell FFI对于C回调非常稳健吗?将Haskell闭包转换为C风格的函数指针很容易和常见。

我是否使用State Monad在Haskell DLL函数调用之间保留大型数据集的内存?这在很大程度上取决于您设计的API。在许多情况下(例如大多数UI库),这实际上是不可行的,因为主循环在C而不是Haskell中;可以使用IORef或类似方法代替。

如果这是您的第一个Haskell项目,我强烈建议避免手动FFI工作,特别是尝试通过FFI混合Haskell和C ++。有很多困难的事情需要习惯,而不必把它们混在一起。如果您计划使用它的唯一目的是UI,则可以利用其他人的艰苦努力:Hackage上提供了最大的UI工具包的Haskell绑定。

谢谢Daniel。我在考虑用Qt(C++)来做所有的UI,而Haskell则用于解析CSV、计算等方面。 - MUXCAH
谢谢Daniel。我在考虑用Qt(C++)做所有的UI,而Haskell则用于解析CSV、计算等方面。我想说我对Qt非常熟悉,它有一个不错的UI设计和IDE。我看了wxHaskell和gtkhs,似乎需要手动编写UI。此外,我需要Qt来处理Excel和Word,它可以做得相当好。 - MUXCAH
@MUXCAH,Haskell有与Qt的绑定。 - Daniel Wagner

10

学习Haskell是成为优秀的函数式编程人员的好方法,因为它教你如何以纯函数式的方式编写代码 - 这是其他函数式语言也强调的内容,但不强制要求。

话虽如此,如果你想与像Excel这样固有的可变命令式API之类的东西进行交互,那么使用不强制执行纯函数式的语言可能是解决问题的更简单的方法。

如今大多数编写Excel代码的人都在使用.NET,因此Excel的.NET库(从F#中工作得很好)比其他平台获得的库要先进得多。

在决定之前,您可能需要查看以下库:

  • NetOffice是一个非常完善的文档库,将所有办公室API包装在一个(相当)易于使用的.NET API中,您可以在F#中使用该API而不必担心任何阻碍。

  • Csv Type Provider是F # Data的一部分,不仅是CSV解析器,还可以根据CSV文件推断类型,并为CSV数据结构提供带类型的访问。

  • 如果您想进行一些数据分析,那么Deedle是由BlueMountain Capital开发的用于F#的开源数据分析库,非常经过充分测试 - 并且具有在相当大(但相对较小)的数据集上进行基本数据分析的简单API(如果适合2GB,则应该没问题)。

听起来对于您描述的项目类型,您可以通过使用已经存在的.NET/Mono库和F#特定库获得很多东西 - 并且在同一个运行时上,您不必担心任何FFI。


1
这并没有真正回答问题(而且Haskell并不“强制你纯洁”;它只是在类型系统中清晰地隔离非纯代码)。 - GS - Apologise to Monica
3
你说得对。我不是在回答问题,而是提供一个有用的指导。尝试使用Haskell来进行与Excel的FFI似乎是一个非常糟糕的想法。 - Tomas Petricek
2
“我是新手”可能意味着需要一些指导。 - nicolas
1
“不要这样做”通常是最好的答案。如果有人问如何跳崖,我们没有义务推他们。 - Craig Stuntz
4
感谢您的意见。经过一些研究,我决定用C# / F#来实现这个项目。对于这个特定的工作,F#似乎是更好的选择。 - MUXCAH
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接