functional-programming - 函数式编程模型效率(特定于 Erlang)

标签 functional-programming erlang

嗨,我是 Erlang 世界的新手。当我想到我们需要如何解决以下问题时(并且有一长串类似的问题),我认为它确实效率低下,因为我们正在谈论很多递归。显然,像 C/Java 这样的语言不需要笨拙的递归来解决这个问题,但是使用 Erlang(我猜其他函数式编程语言也需要,也许吧?)你必须这样做。

示例 3 - 追加

该程序连接两个列表:

append([], List) -> List;

append([First|Rest], List) -> [First | append(Rest,List)].

谁能解释为什么这不是问题?

最佳答案

首先,阅读Erlang efficiency guide关于递归。

至于笨拙,不要忘记Erlang列表是单链表,所以你只有一个指向列表头部的“指针”,需要通过遍历列表来访问元素。
这将需要相同数量但与所有指针或引用杂耍的语言不同的笨拙程度。

至于效率,你可以用尾递归的方式来实现。尾递归经过优化( see this SO question ),编译后的代码变得类似于您在 C++ 中实现的代码,唯一的区别是代码指针不是跳来跳去,而是堆栈指针倒带等。

无论如何,尝试在 Java 和 C++ 中实现完全相同的功能,然后我们将看到哪个更笨拙且更具可读性。

关于functional-programming - 函数式编程模型效率(特定于 Erlang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1496246/

相关文章:

tcp - 关闭 OTP Supervisor 拥有的 gen_tcp 监听套接字

tcp - 如何处理 Erlang 中 TCP 流中数据包的错误长度 header ?

erlang - elixir 中 inet parse_address 命令的语法错误

haskell - Monad 不就是一个语法糖吗?

scala - 做某事最多 N 次或直到在 Scala 中满足条件

haskell - 在 Haskell 中,在此列表理解中使用 takeWhile 或使用 "regular"不等式有什么区别?

.net - F# 如何将元组列表转换为并行数组

testing - eunit:如何测试一个简单的进程?

javascript - Couch DB 中的 Erlang View

haskell - ixmap、数组和逆变仿函数之间的关系是什么?