【问题标题】:Elixir and Haskell interoperabilityElixir 和 Haskell 互操作性
【发布时间】:2018-10-08 04:38:49
【问题描述】:

作为处理并发问题的平台,Elixir/OTP 似乎是最适合的解决方案。

在使用 Web 界面编写应用程序时,请考虑我想使用另一种函数式语言(即 haskell)来推理和解耦应用程序逻辑的情况(由于其在编译时高级检测错误等好处,静态类型等)。然后我将使用GenServers 处理并发,并使用Phoenix.Channels 附加一个Web 界面。

这个设置甚至可以使用NIFs 吗?此外,是否会保持真正的并发性?我不确定我在这里是否遵循正确的推理路线,但是是否能够根据GenServer 的要求生成一个新的haskell 进程,并且两者是否能够有效地沟通?

【问题讨论】:

  • 也许我遗漏了一些东西,但正如所写的那样,这个问题对我来说似乎很不清楚。我无法说出您在这里设想的架构。尽管即使我可以,我也不确定这个问题是否是 SO 的主题。这似乎主要是关于软件工程而不是编程本身。如果您对此进行更详细的说明,则有关并发性的问题可能会得到解答,其余的我不太确定。
  • NIFs 是 Elixir/Erlang 与外部程序互操作的机制。所以这里的架构将是两个 Elixir Applications - 一个 Phoenix Application 用于 Phoenix.Channel Web 界面,第二个将处理 Haskell 互操作(这将作为依赖项加载到第一个中)。 Haskell 应用程序将与 w 进行通信。长生不老药通过NIFs。 OTP 是指一组 Elixir Behaviours(包括 GenServer),利用 BEAM 来处理并发。
  • 有偏见和固执己见: 选择 Haskell 是因为大肆宣传以大幅增加复杂性,这听起来不够合理。 NIF 会毁掉你所有的类型安全(即使它是好的),你要踩的陷阱和耙子的数量会使整个开发过程成为一场灾难(除了过于复杂的互操作会带来比以往更多的问题发生在普通的老好药应用程序中。)
  • “真正的并发会被维护吗?”不是可以轻易回答的问题。它不仅仅依赖于 Haskell 和 Elixir,而是更多地依赖于代码的编写方式。
  • 考虑使用github.com/jeremyjh/dialyxir 进行类型相关的错误检测。

标签: haskell elixir interop erlang-otp


【解决方案1】:

使用 NIF 和 GHC 的 FFI 以及少量样板文件 written in C,当然可以进行此设置。但是NIFs are best used for short synchronous computations with no side effects 我觉得这不是这些操作。

对于应用程序的 Haskell 部分,使用 C Nodes 可能会更好。您会找到的大部分文档都是针对 Erlang 而不是 Elixir,但考虑到 Elixir 与 Erlang 的简单互操作,它应该非常简单(某人的 even written an example)。大部分艰苦的工作将与编写 Haskell“C 节点”有关,粗略地浏览一下 hackage 和 github 并没有发现任何结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 2014-01-03
    • 2017-08-12
    • 2010-09-21
    • 2020-07-27
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多