代码之家  ›  专栏  ›  技术社区  ›  Stephane Rolland

Haskell与C++的混合

  •  34
  • Stephane Rolland  · 技术社区  · 14 年前

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

    有没有人做过这样的联想,(当然)?

    (Haskell站点告诉我们这非常简单,因为Haskell有一个模式,可以通过gcc用C编译)

    这是一个相当模糊的问题,但当我计划学习Haskell时,我正在考虑将一些工作委托给Haskell代码(我在实际编码中学习),我想选择一些我将看到Haskell好处的部分。

    4 回复  |  直到 14 年前
        1
  •  28
  •   Greg Bacon    14 年前

    Haskell的好处是它允许您使用强大的抽象。你不是在思考1、0、地址和寄存器,而是计算、类型属性和连续体。

    这两种说法之间有张力。在他的论文里 “Structured Programming with go to statements,” Donald Knuth写道

    知道如何使用Haskell和C++,而且如何以及何时使用 结合 他们很好地解决了各种问题。

    我写的最后一个大项目 FFI 涉及使用用C语言编写的内部雷达建模库。重新实现它将是愚蠢的,表达应用程序其余部分的高级逻辑将是一件痛苦的事。我把它的大脑保存在Haskell中,需要时给C库打电话。

        2
  •  11
  •   Alexandre C.    14 年前

    以下是我的看法:

    • 改变事物 . 无论什么时候,只要你编写的程序接受一个输入并映射/过滤/减少它,就要使用函数结构。网络应用程序给出了Haskell应该出类拔萃的精彩现实例子(基本上是将存储在数据库中的东西转换成网页)。
    • 过程语言(OOP语言 (程序)擅长副作用和对象间的交流。使用它们来转换数据很麻烦,但是无论何时您想要进行系统编程或(双向)与人交互(任何类型的用户界面,包括客户端web编程),它们都能干净利落地完成这项工作。
    • 然而,有些人可能会认为用户界面应该有一个功能描述,我的回答是,建立良好的框架很容易与OOP语言一起使用,人们应该这样使用它们。毕竟,从对象和对象之间的通信的角度来考虑UI组件是很自然的。
    • IO只是一种工具:无论何时将输入转换为输出,Haskell(或任何FP语言)都应该执行IO。无论何时你和人说话,C++(或任何OOP语言)都应该做IO。
    • 不在乎速度。当你用Haskell做正确的工作时,它是高效的。当您使用C++或Python进行正确的工作时,效率很高。

    因此,让我说我精通Haskell、C、C++和Python,这里是我如何编写应用程序:

    • 如果我的应用程序的主要角色是转换数据,我将它写入Haskell,可能会用C编写一些低级部分(这反过来又调用C++编写的一些高科技低级别的部分,但我会把C作为可移植性的接口)。
    • 如果我的应用程序的主要角色是与用户交互,我用Python(PyQt)编写它,并让Python调用C++中的性能关键例程(Boosi::Python作为绑定生成器很好)。我可能还需要调用转换或获取数据的子程序,这些子程序将用Haskell编写。
    • 如果我必须用Haskell编写应用程序的一部分,我会将它隔离到一个C-callable API中。
    • 有时,Haskell应用程序在stdin上读取内容并在stdout上写回内容,作为子模块(您可以用fork/exec或平台上的任何东西调用它)是很有用的。有时,shell脚本是此类应用程序的正确包装器。
        3
  •  7
  •   Nathan Shively-Sanders    14 年前

    这个答案比一个全面的答案更为简单,但我使用了哈斯克尔、Python和C++的混合语言,用于计算语言学的论文,以及我没有编写的几个C和java工具。我发现把所有事情都当作一个单独的进程来运行是最简单的,用Python作为胶粘代码来启动Haskell、C++和java程序。

    C++是一个相当简单的循环,它可以对特征发生进行计数。基本上它所做的只是数学和简单的I/O。我实际上通过让Python胶水代码写出一个充满 #define 重新编译。有点老套,但很管用。

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

    这是一个你希望Python强大的领域,但是我发现Haskell使复杂结构的操作更容易;Python可能更适合于简单的行到行转换,但是我正在切割解析树,我发现我在用Python编写代码时忘记了输入和输出类型。

        4
  •  5
  •   pmr    14 年前

    我从来没有混合过两种语言,但你的方法让我觉得有点颠倒。 Haskell更适合高级操作,而C++可以被优化,并且对于紧环和其他性能关键代码最有好处。

    Haskell最大的优点之一是将IO封装到monad中。只要这个IO不是时间关键,我就看不出有什么理由在C++中做。

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