functional-programming - 关于学习 "How to Think Functional"的建议?

标签 functional-programming erlang

作为函数式语言的新手(几周前我开始接触 Erlang——我可以接触的第一种函数式语言)。

我开始写一些小算法(比如 left_rotate_list , bubble_sort, merge_sort 等)。我发现自己经常迷失在诸如“我应该使用辅助列表来存储中间结果吗?”之类的决定中。和“我应该创建一个辅助函数来做到这一点吗?”

一段时间后,我发现函数式编程(如果我说的完全没有意义,请耐心等待)鼓励“自上而下”的设计:即,当我执行 merge_sort 时,您首先写下所有合并排序步骤,并将它们命名为单独的辅助函数;然后你一个一个地实现那些辅助函数(如果你需要进一步划分那些辅助函数,用同样的方法来做)。

这似乎和OO设计有点矛盾,你可以从底层开始构建基本的数据结构,然后把数据结构和算法组装成你想要的。

感谢您的评论。是的,我想得到关于如何“用函数式语言思考”的建议(就像“用 Java 思考”、“用 C++ 思考”一样)。

最佳答案

After a while, I found that functional programming […] encourages a "top down" design.



我不确定这是一个准确的说法。我最近一直在尝试自学函数式编程,我发现一种“自下而上”的编程风格确实对我有帮助。要使用您的合并排序示例:
  • 首先看基本情况。如何对 0/1 元素的数组进行排序?
  • 接下来,看看 base + 1, base + 2, ... 的情况。最终,您应该看到一种模式(拆分为子问题、解决子问题、组合子解决方案),它允许您编写一个通用的递归案例,而不是最终达到基本案例。
  • 拆分为子问题很容易,但合并子解决方案有点困难。您需要一种将两个排序数组合并为一个排序数组的方法。
  • 现在把所有东西放在一起。恭喜,您刚刚编写了归并排序。 :)

  • 我可能会误用这个术语,但这对我来说就像是自下而上的设计。函数式编程与面向对象编程不同,但在两者之间切换时,您不需要完全放弃现有的设计技术。

    关于functional-programming - 关于学习 "How to Think Functional"的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1549017/

    相关文章:

    javascript - 阻塞事件循环

    python - 功能制作

    erlang - 如何在没有崩溃报告的情况下优雅地终止 gen_server

    Scala 函数模式计算状态

    c# - C# 中的 Monadic 编程

    Java8 : collecting a stream into a SortedMap by key

    database - 从 mnesia 中选择随机记录

    Java erlang套接字通信

    erlang - 寻找Erlang问答平台/社区

    erlang - 如何在 Elixir 主管中引用之前启动的进程