如果您有可能同时使用Haskell和C ++的应用程序。您会让Haskell管理哪些层,您会让C ++管理哪些层?

有没有人做过这样的联系,(肯定)?

(Haskell网站告诉这确实很容易,因为Haskell具有一种模式,可以通过GCC将其编译为C)

起初,我认为我会将所有I/O操作保留在C ++层中。以及GUI管理。

这是一个非常模糊的问题,但是当我打算学习Haskell时,我正在考虑将一些工作委派给Haskell-Code(我在实际编码中学习),并且我想选择一些部分,我会看到Haskell的好处。

有帮助吗?

解决方案

Haskell的好处是它允许您使用的强大抽象。您不是在考虑零,地址和寄存器方面,而是在计算和键入属性和连续性方面思考。

C ++的好处是,您可以在必要时进行优化。您没有考虑胸怀较高的单调,箭头,部分应用和组成纯粹的功能:使用C ++,您可以直达裸机!

这两个陈述之间存在紧张关系。在他的论文中 “结构化编程与 go to 陈述,” 唐纳德·诺斯(Donald Knuth)写道

我很长一段时间以来一直认为,编程的人才主要包括能够轻松从微观转变为事物的宏观观点的能力, IE, ,流利地改变抽象水平。

知道如何使用Haskell和C ++,还知道如何以及何时使用 结合 他们很好地击倒各种问题。

我写的最后一个大项目 FFI 涉及使用编写的内部雷达建模库。重新实现这将是很愚蠢的,并且表达其余应用程序的高级逻辑会很痛苦。我将其“大脑”保留在Haskell中,并在需要时打电话给C库。

您想作为练习做这件事,所以我建议您采用相同的方法:在Haskell中写下智能。将Haskell作为C ++的奴隶shake之以鼻可能最终会让您沮丧或让您感到自己好像浪费时间。使用其优势所在的每种语言。

其他提示

这是我看到事物的方式:

  • 功能语言在 改变事物. 。每当您编写输入输入和映射/过滤器/降低的程序时,请使用功能构造。 Web应用程序给出了Haskell应该出色的美好现实世界示例(您基本上将存储在数据库中的内容转换为网页)。
  • 程序语言(OOP语言 程序性)在物体之间的副作用和通信方面表现出色。它们很麻烦地用于转换数据,但是每当您想与人类(包括客户端网络编程在内的任何类型的用户界面)进行系统编程或(双向)交互时,他们会干净地完成工作。
  • 但是,有些人可能会说用户界面应该具有功能描述,我回答说,建立的框架很容易与OOP语言一起使用,该框架应该以这种方式使用它们。毕竟,从对象和对象之间的通信方面考虑UI组件是很自然的。
  • IO只是一个工具:每当您将输入转换为输出时,Haskell(或任何FP语言)都应该执行IO。每当您与人交谈时,C ++(或任何OOP语言)都应该做IO。
  • 不在乎速度。当您将Haskell用于合适的工作时,这是有效的。当您将C ++或Python用于合适的工作时,这是有效的。

因此,假设我会说出Haskell,C,C ++和Python,这是我编写应用程序的方式:

  • 如果我的应用程序的主要角色是转换数据,我将其写在Haskell中,可能是C ++编写的一些高科技低级零件,可能会用C ++编写一些低级零件,但我会坚持使用出于可移植性原因,以C作为接口)。
  • 如果我的应用程序的主要角色是与用户互动,我将其写在Python(例如PYQT)中,然后让Python Call Call call performance-Trescormity-Contrical-timpartion-timper-timplesion-tocial-wenter(boost :: python作为绑定生成器非常好)。我可能还必须调用转换或获取数据的子例程,这些数据将用Haskell编写。
  • 如果我必须在Haskell中编写应用程序的一部分,则将其隔离为可容易的API。
  • 有时,在stdin上读取内容并在STDOUT上写回的Haskell应用程序可作为子模型(您使用fork/exec或平台上的任何内容)有用。有时,Shell脚本是此类应用程序的正确包装器。

这个答案更多的是一个故事,而不是一个全面的答案,但是我将Haskell,Python和C ++的混合物用于我在计算语言学方面的论文以及我没有写的几种C和Java工具。我发现将所有内容作为一个单独的过程最简单,使用Python作为胶代码来启动Haskell,C ++和Java程序。

C ++是一个相当简单,紧密的循环,计算特征出现。基本上,它所做的只是数学和简单的I/O。我实际上通过让Python胶代码写出一个装满的标题来控制选项 #defineS和重新编译。有点骇人听闻,但奏效了。

Haskell是所有中间处理:从我使用的各种C和Java解析器中获取复杂输出,过滤外部数据,并将其转换为简单的格式,即C ++代码预期。然后,我将C ++输出转换为乳胶标记(除其他格式)。

这是您期望Python强大的领域,但我发现Haskell使操纵复杂的结构更容易。 Python可能会更好地用于简单的线到线转换,但是我在切片和划分解析树,我发现当我在Python编写代码时,我忘记了输入和输出类型。

由于我使用的是一种更结构结构化的脚本语言,因此我最终写了一些文件I/O实用程序,但是除此之外,这是Tree的内置库和列表的操作。

总而言之,如果您有像我这样的问题,我会建议使用C ++,以供内存约束,速度限制性部分,Haskell用于高级转换,以及Python运行全部。

我从来没有混合过两种语言,但是您的方法对我有些颠倒。 Haskell在高级操作方面更加贴切,而C ++可以优化,并且对紧密循环和其他性能关键代码最有益。

Haskell的最大好处之一是将IO封装到单片中。只要这个io并不关键,我就不会看到任何理由在C ++中进行。

对于GUI部分,您可能是对的。有很多Haskell GUI库,但是C ++具有强大的工具,例如QTCreator,可以简化繁琐的任务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top