关于学习“如何思考功能性”的建议?

2024-02-12

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

我开始写一些小算法(比如left_rotate_list, bubble_sort, merge_sortETC。)。我发现自己经常迷失在诸如“我应该使用辅助列表来存储中间结果吗?”之类的决策中。以及“我应该创建一个辅助函数来执行此操作吗?”

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

这似乎有点违背OO设计,在OO设计中你可以从底层开始构建基本的数据结构,然后将数据结构和算法组装成你想要的东西。

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


答案是函数式编程是使用数学中定义的函数进行编程(简而言之,将值从域映射到共域的无副作用的东西)。实际上将其转化为“如何思考”是一个挥手的部分,很难详尽无遗,但我将举例说明我的一些想法:

  1. 定义比效率更重要。也就是说,人们可以理解其所有行为的明显正确的函数实现比难以推理的复杂优化函数要好。 (并且应该尽可能长时间地被优先考虑;在有证据之前,人们必须破坏这一美好的财产。)
  2. 数学函数没有副作用。一个有用的程序必然有副作用。函数式程序员意识到副作用是一件非常危险和复杂的事情,并将程序设计为一堆函数,这些函数从一个副作用中获取输出值,并为下一个副作用创建输入值。

第一个与模糊相关:“优雅的代码”。列表推导式可以呈现非常简洁的数学方程,例如函数的定义。只要看一下用 LC 实现的快速排序即可。这就是我对优雅、简洁、让所有行为变得清晰的定义。不是 Perl 代码高尔夫,您通常会简洁而神秘。

第二点是我在所有编程中日常使用的东西。将代码划分为当前状态的函数(方法、例程等),这些函数是无副作用的计算,为下一个要采取的操作提供输入(即使是下一个要采取的操作)。返回值后,将其交给执行所描述操作的例程,然后重新开始。

在我的脑海中,我将 Erlang 过程绘制为状态机图,其中每个顶点都是一个副作用,也是一个函数,其输出是从顶点中选择哪条边。函数式编程范式教会了我对副作用的高度重视。特别是在 Erlang 中,因为副作用在并发性中确实很重要,而 Erlang 使并发性变得非常可用。

同样,一些孤立的部落只有一个词来表示 3 以上的数字,或者没有词来表示“我的”/“你的”。感觉流行语言没有“这会导致副作用”这样的词语,但函数式编程有。它迫使你一直意识到这一点,这是一件好事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于学习“如何思考功能性”的建议? 的相关文章

  • 如何解释方案表达式 '(a 'b)

    a b 给出答案 a b 当 a 没有绑定 未加引号 时 这是如何工作的 这就是我们计算表达式时发生的情况 a b gt a b The quote 是简写quote http docs racket lang org guide quot
  • 您应该将应用程序属性放在 rebar erlang 应用程序中的什么位置?

    新手问题 我编写了第一个基于 rebar 的 erlang 应用程序 我想配置一些基本属性 例如服务器主机等 放置它们的最佳位置在哪里以及如何将它们加载到应用程序中 接下来的步骤是发布版本并在其中创建节点 节点在独立的 Erlang VM
  • 如何使用非类型化语言中的 Reader Monad 在整个组合中隐式地线程化参数?

    我知道裸读者单子仅包含两个功能 const chain g gt f gt x gt f g x x const of x gt gt x 但我对它如何工作或如何应用没有任何直觉 知道 is 用于在整个组合中隐式地线程化参数并没有多大帮助
  • 不可变数据结构性能

    我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能 根据我在 F Sets 中读到的内容 内部使用红黑树作为其实现 如果每次我们想要向红黑树添加新内容时 我们基本上都必须重新创建它 那么它如何才能具有良好的性能呢 我在这里
  • 如何在函数式编程中为AST节点生成稳定的id?

    我想将一个特定的 AST 节点替换为另一个节点 并且这个替换的节点是由交互式用户输入指定的 在非函数式编程中 可以使用可变数据结构 并且每个AST节点都有一个对象引用 因此当我需要引用特定节点时 我可以使用这个引用 但在函数式编程中 使用I
  • D 中的特征可以用于类型类吗?

    我是 D 新手 我正在寻找一种使用类似 Haskell 的类型类进行编程的好方法 例如D 中的函子 幺半群等 Tango 或 Phobos 中是否实现了类似的功能 我听说过可以对某些属性进行编译时类型检查的特征 它们可以用于类型类吗 我尝试
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • Erlang 如何并发处理访问邮箱

    关于如何使用erlang邮箱的信息有很多 但很少找到一篇论文或文档描述erlang如何在VM内部同时实际访问邮箱 据我了解 Erlang VM 必须执行锁定或 CAS 操作以确保消息完整性 erlang幕后有没有什么精巧的方法 我假设您所说
  • 功能段落

    抱歉 我还不太明白 FP 我想将一系列行分割成一系列行序列 假设一个空行作为段落划分 我可以在 python 中这样做 如下所示 def get paraghraps lines paragraphs paragraph for line
  • Scheme/Lisp 嵌套循环和递归

    我正在尝试解决方案中的一个问题 该问题要求我使用嵌套循环或嵌套递归 例如我有两个列表 我必须检查它们的笛卡尔积的条件 解决这些类型问题的最佳方法是什么 有关如何简化这些类型的函数的任何指示吗 I ll elaborate a bit sin
  • 返回元组的第一个元素

    假设我创建一个将两个整数相加的函数 def addInt a Int b Int Int Int val x a b x 2 我回来了 result 2 故意为了这个问题 现在我想创建一个仅返回 x 的变量 val result addIn
  • 如何使用 ibrowse 将附件上传到 CouchDB 中的文档?

    我已经使用curl上传图像文件Penguins jpg 例如 C curl gt curl vX PUT H Content Type image jpeg http localhost 5984 DBNAME DOCID Penguins
  • 如何使用 swift flatMap 从数组中过滤掉选项

    我对 flatMap 有点困惑 添加到 Swift 1 2 假设我有一些可选类型的数组 例如 let possibles Int nil 1 2 3 nil nil 4 5 在 Swift 1 1 中 我会做一个过滤器 然后是一个像这样的地
  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • Erlang:如何将小数转换为填充零的十六进制字符串

    我想在 Erlang 中将 42 基数 10 转换为 000002A 基数 16 我在网上找到了一些提示 io format 8 0B n 42 gt 00000042 And io format 16B n 42 gt 2A 但我似乎无法
  • 停止 Erlang 守护进程

    除了跑步 killall 9 beam smp 当我知道 Erlang 节点的情况时 如何以编程方式杀死它 sname 如果我不希望心跳监视器重新启动该进程 如何确保上述问题的任何答案也会终止心跳 有没有一个不错的指南来将 Erlang 部
  • 如何通过 SSL 从 Phoenix Web App 连接到 PostgreSQL?

    When trying to run Elixir Phoenix Web Application using PostgreSQL Database hosted 3rd party Database as a Service Azure
  • Erlang Mnesia 中的分页搜索

    例如 给定记录 record item id time status 我想搜索 1000 到 1100 个项目 按时间和顺序排序status lt lt finished gt gt 有什么建议么 这取决于您的查询是什么样的 如果您需要按许
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov

随机推荐

  • 计算多部分表单帖子的内容长度

    我正在尝试上传文件而不将其加载到内存中 如下所示 像 S3 这样的服务需要Content Length在这种情况下设置 是否有内置的 go lang 可以做到这一点 或者我必须自己计算它 package main import io mim
  • 即使 java gradle 工具链设置为 jdk 11,Gradle 仍使用 Java 1.8 构建 android 项目

    FAILURE Build failed with an exception Where Build file bitrise src app build gradle line 1 What went wrong A problem oc
  • 调用 Java Web Service 时,C# 响应对象包含 null

    我已收到以下 wsdl 我使用 wsdl exe 生成了 C 代理 并创建了我的 C 网页 我使用 Fiddler 查看了 SOAP 响应 它包含数据 有关需要进行哪些修改才能使 C 程序接受 SOAP 响应的任何指导 请原谅 wsdl 的
  • 有 Android 开发人员成功从 Web 服务接收分块传输协议吗?

    我一直在努力尝试几个类实现来检索分块数据 但没有成功 以下是存在问题的简化代码模块 在网上冲浪后 似乎过去曾出现过问题 2009 2010 版本1 1 1 5 但现在应该已经解决了 我还没有看到该协议在 Android 平台上取得任何明确的
  • SQLiteOpenHelper 与 ContentProvider

    我是 Android 开发新手 我正在尝试创建一个从内部数据库 SQLite 读取并列出列表中的所有数据的应用程序 我正在使用listView 到目前为止我有一门叫做DatabaseHandler延伸SQLiteOpenHelper这就是执
  • 如何对D3js进行月/日本地化?

    我正在寻找一种在 D3 上进行本地化的方法 我已经找到了价值观 d3 time days Sunday Monday Tuesday Wednesday Thursday Friday Saturday d3 time dayAbbrevi
  • 请求:https://www.w3.org/2000/svg 找到:http://www.w3.org/2000/svg [重复]

    这个问题在这里已经有答案了 我们使用 Apache Batik 来渲染 SVG 文件 出于安全原因 所有 URL 均转换为 HTTP 现在 当我们渲染 SVG 文件时 我们遇到了这个问题 原始 SVG 是 svg xmlns http ww
  • Jackson - 将 JSON 反序列化为类

    我正在调用一个返回 JSON 的端点 看起来像这样 在 Postman 中 Result attribute1 attribute2 该请求返回的Content Type标头是text x json 与通常的application json
  • Sonata admin - 相关表中的“排序依据”字段

    我有一个产品管理课程 产品实体与类别实体具有多对一关系 即产品与类别相关联 在产品的管理 列表 页面中 我需要按每个产品关联的类别名称 按字母顺序 排序 如果字段位于实体本身上 则设置默认排序依据字段很容易 请参阅索纳塔管理员捆绑订单 ht
  • Retrofit中如何设置最大网络连接数

    我正在查看一些 AQuery 代码here https stackoverflow com questions 20488302 aquery android query how to load images actually发现有一种方法
  • 通过附加到新环境来检查 .rdata 文件的内容 - 可能吗?

    我感兴趣的是在 RDATA 文件中列出对象并仅加载选定的对象 而不是整个集合 以防某些对象可能很大或可能已存在于环境中 我不太清楚当名称存在冲突时如何做到这一点 因为attach 效果不太好 1 用于检查 R 数据文件的内容而不加载它 这个
  • 如何使用 html2canvas 和 jspdf 以正确且简单的方式导出为 pdf

    我目前正在开发一个学校管理软件 通常需要导出包含以下内容的html内容data tables and div tag 我已经尝试了所有可能的方法来编写一个能够以良好的方式导出我的 html 数据的代码 最好使用 css 在检查了一些问题和答
  • Heroku create-react-app 部署未捕获的语法错误:意外的令牌 <

    每当我使用 create react app buildpack 部署 heroku 应用程序时 第一次尝试访问我的域时 加载的页面是白色的 并且开发人员控制台中出现错误 Uncaught SyntaxError Unexpected to
  • 在Python中解析json字段

    有没有关于在 python 中解析 json 属性的好教程 我希望能够解析 ok 字段的真实值 以及名为 client ind 1 的索引 我不明白 python 文档对这个主题的覆盖范围 如果有人可以解释或向我指出更好的资源 那就太棒了
  • Cordova谷歌地图API密钥足够安全

    我想知道我现在使用的 Google 地图 API 密钥是否安全 因为我有一个带有 Google 地图的 Cordova 应用程序 所以我生成了一个 API 密钥 我无法将我的域密钥列入白名单 因为它在手机上运行客户端 此外 任何解压我的应用
  • 在 WinForms 中使用 XAML

    我想使用 XAML 在完整的 WinForms 应用程序中编译时生成类 尽管我愿意接受建议 但我不想使用 WPF 看起来这应该是可能的 但我找不到任何关于具体如何实现的信息 我发现的最接近的是这个页面 http anoriginidea w
  • 如何在故事板或 xib 中选择背景视图

    如果我用鼠标在情节提要或 xib 中选择一个视图 Xcode 将选择最前面的视图 我知道我可以选择文档大纲中的其他视图 但如果我想抓取背景视图并用鼠标移动它 当我在故事板中单击时 最前面的视图会再次被选中 我认为有一种方法可以循环浏览视图并
  • Visual Studio 2008 支持经典的 ASP 开发吗?

    Visual Studio 2008支持经典的ASP开发吗 我创建经典 ASP 网站已经很多年了 我想知道我是否可以使用我当前的工具集 或者我是否必须放弃使用记事本 Thanks Matt 我知道 VS 2008 现在包含经典 ASP 的智
  • 无法通过 AVPlayer 通过 HTTP 播放 mp3 文件

    我正在尝试通过 AVPlayer 播放 MP3 文件 let url URL string http transom org wp content uploads 2004 03 stereo 40kbps mp3 7 let asset
  • 关于学习“如何思考功能性”的建议?

    作为函数式语言的新手 几周前我开始接触 Erlang 我能接触到的第一种函数式语言 我开始写一些小算法 比如left rotate list bubble sort merge sortETC 我发现自己经常迷失在诸如 我应该使用辅助列表来