【问题标题】:Python and functional language interopPython 和函数式语言互操作
【发布时间】:2013-04-05 15:07:34
【问题描述】:

我目前的主要编程语言是 python。我喜欢它的很多地方,但我也喜欢函数式语言。不足以在其中做一个完整的程序,但对于某些功能来说绝对是,这很适合功能模具。

当然 .NET 在这方面是惊人的,同时拥有 ironpython 和 F#。但考虑到 Ironpython 对科学 Python 生态系统的支持在我上次检查时仍然不可靠,.NET 对我来说并不是一个选择。我对明显缺乏促进 cpython 和 Haskell 之间互操作的工具感到有点震惊。它们都是拥有大型社区的成熟语言,这对我来说似乎很合适。

他们的架构是否有什么东西让他们不兼容而我错过了,或者这只是一些很棒的东西仍在等待发生?

澄清;那里有一些半生不熟的项目,但我在想一些与 Weave、pycuda 或 boost 的令人敬畏相似的东西。只需几个注释即可自动执行互操作中固有的所有管道。

【问题讨论】:

  • 你可以在 Cythons 和 Haskell 的 C FFI 之间进行互操作
  • 对。 Haskell 与 C 互操作,python 与 C 互操作。所以理论上应该可以让我的 python 列表自动转换为 Haskell 列表,反之亦然。但是在我看来,没有工具可以巧妙地抽象出这样的样板,优势很快就被掩盖了。
  • 我认为这是一个文化问题。这就像...通过 Java 脚本服务使 AWK 脚本可以在 Scala 中使用?
  • 不是对所提出问题的答案,但你见过连字符吗? (见stackoverflow.com/questions/5015447/…)。它似乎比那里的一些 python/haskell 桥更广泛地开发。

标签: python functional-programming interop


【解决方案1】:

参考:

他们的架构有什么东西让他们 我缺少的不兼容,或者这只是一些很棒的东西 还在等待发生吗?

我认为这与使用这些语言的人有关:

想要同时做 Haskell 和 Python 的人并不多。

  1. 要同时使用两种语言(例如 Haskell 和 Python),您可以通过 C 接口或创建两种语言都可以使用的协议。

    两者都相当先进,限制了能够做到这一点的人数。当然,也会有一些折衷,这使得难以充分利用两种语言的全部功能。

  2. 我正在使用 Python,虽然我知道一些 Haskell,但我不会编程。我有点陷入面向对象的困境,告诉我有一天一个问题会决定我在 Haskell 中比在 python 中更好地解决它。这个问题还没有出现,因为我的第一个想法是:我知道如何在 Python 中做到这一点。我认为其他“专家”也面临这个问题。

  3. 你开始用一种语言思考。我认为 Haskell 的功能风格完全不同,没有副作用。要进入这种想法,我需要忘记或不使用我的 Python 知识。在这两种思维方式之间切换需要一些力量。

总结一下:因为这两种语言不是那么接近,而是彼此分开。两者都很难,而且没有很多或简单的方法来练习两者。

【讨论】:

  • 总结一下:你并没有真正明白这一点。但请相信我:当它们无缝集成时,使用函数式语言会变得更有吸引力。不要告诉功能狂热者,但有些任务更适合一种风格或另一种风格。用函数式语言将像素放入帧缓冲区就像将方形钉子放入圆孔中一样,f.i.这就是让我停止功能语言的原因。无论如何,我已经同时使用了无数种语言,所以这对很多人来说不是障碍。数百行样板代码来包装一个 5 行函数。
【解决方案2】:

如果不考虑面向对象和命令式语言相对于函数式语言的惯性,我认为对这个问题的任何回答都是不恰当的。考虑以下情况,首先是函数式语言的教授频率几乎没有中学、大学或研究生阶段的面向对象或命令式语言的频率。正如用户所提到的,作为程序员,在选择语言方面有很大的动力。例如,在一所四年制大学的典型 CS 学位课程中,一个人可能会学习几种语言,而且很可能没有一种是函数式语言。然后,这个典型的毕业生将继续在工业界工作,在为自己的工作每周编程 40 多个小时后,很难再花时间不仅学习一门全新的语言,而且学习一门有效的语言与已经知道的完全不同。除此之外,还有一个缺点是函数式语言在工业中的用处不如面向对象或命令式语言那么有用。可以看出,鉴于当前的状态,Python 和 Haskell 之间的互操作性并不是某些程序员所希望的,这是可以理解的。

【讨论】:

    【解决方案3】:

    如果您要使用 Haskell 到 Python 的绑定,您会在每种语言中做什么?

    如果您考虑绑定 C 和 Python,例如,当您需要提高速度时使用 C,或者当您需要推送位时,并且当您想要表达和简洁时使用 Python。您通常有两种语言,一种用于大多数逻辑,另一种可以down 以提高速度,但以清晰为代价。语言之间的差距越大,您从切换中获得的收益就越多。

    如果我们要绑定 Haskell 和 Python,那么你会从中得到什么就不太清楚了。我不会仅仅为了速度而从 Python 掉入 Haskell,因为 Haskell 虽然速度快,但不如 C 快。但是如果我使用 Haskell,我什么时候会使用 Python? Python 并不比 Haskell 更有表现力,不像比较 C 和 Python。

    我认为大多数时候,只需 import functools 并在 Python 中进行函数式编程会更容易,而不必将对象转换为一些 Haskell 表示,做一些工作,然后再将其转换回来。

    不过,如果你真的想要它,Cython 会让编写 Haskell 的 FFI 可以使用的函数变得容易。

    【讨论】:

    • 有趣的观察。
    • 我想将 python 用于自然表示为可变代码的事物,并将 Haskell 用于数学内部循环,其中 Haskell 的不变性允许我编写更明显正确的代码(这也是比python快得多;并接近C)。但可变/不可变的概念划分将是对我的主要吸引力。
    • 您想让我充实 FFI 以展示如何在 Python 中绑定 Haskell 函数吗? (我自己也需要学一点)。
    【解决方案4】:

    另一种方法是使用 unix 管道,只需编写一个 Haskell 程序,还编写一个 Python 程序,让它们通过文本进行通信。 Haskell 和 Python 甚至共享相同的列表语法,因此很容易将数据从一个管道传输到另一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2021-09-09
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多