首页
学习
活动
专区
圈层
工具
发布

我为什么两次放弃了函数式编程,却依然感谢它

但总能在社区里听到一种声音:函数式编程(FP)才是真正的优雅。undefined它纯粹、它无 bug,它能改变你写代码的方式。于是,我挑了最“纯”的语言——Haskell。...我的预期:写代码像写数学公式一样干净。没有混乱的状态,没有难以追踪的 bug。优雅、学术、前沿。现实:“Hello World” 都写得磕磕绊绊。我必须搞懂 Monad 才能在屏幕上输出一句话。...这完全颠覆了我对“程序运行”的直觉。于是,在经过几天的思想挣扎之后,我再次选择了放弃。* * *三、为什么函数式编程这么难?后来我慢慢想明白: 函数式编程不是语法上的变化,而是思维方式的转变。...这就是在“偷师”函数式编程,而不必被它绑死。* * *五、来自社区的声音:为什么很多人放弃 FP?在 Reddit 上,关于 Elixir vs Go 的讨论很有意思。...* * *七、从“理念”到“方法”:给想把 FP 用到生产的人如果你已经能在日常编码中自觉地“少副作用、重不可变、用纯函数”,下一步可以考虑把 FP 落到团队工程实践里:代码层面- 约定:业务函数默认纯函数

20510

为什么 Haskell 是我们构建生产软件系统的首选

在这篇文章中,我将介绍 Haskell 的一些突出特性,这些特性让它成为一种出色的、具有行业水准的语言,从而非常适合构建商业软件;我还会解释为什么我们的新项目考虑使用的第一个工具往往就是它。...仅当这类纯函数没有副作用(例如在主机系统上创建文件、运行数据库查询或发出 HTTP 请求)时这才能做得到。Haskell 的类型系统就具有这种纯度。...它是一个简单的命令行工具,依赖 Haskell REPL 来自动监视代码更改并进行增量重编译。将更改保存到文件后,我们可以立即查看代码中的任何编译器错误。...在具有可变值的语言中,多个线程访问相同的值可能导致诸如条件争用和死锁之类的问题。 由于 Haskell 中的值是不可变的,因此即使程序在多个线程上运行并访问共享内存,也不会出现这类问题。...这也简化了围绕并发编程的思维模型。并发代码通常可以用与单线程代码相同的样式编写,而在新线程上运行底层负载的函数只需包装单线程实现即可。 并发是 Haskell 程序员工具箱中的一项有用工具。

2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    HeRMs :一个命令行食谱管理器

    你可以维护一份小日记/笔记或将配方的笔记存储在智能手机中,或将它们保存在计算机中文档中。这有很多选择。...今天,我介绍 HeRM's,这是一个基于 Haskell 的命令行食谱管理器,能为你的美食食谱做笔记。使用 Herm's,你可以添加、查看、编辑和删除食物配方,甚至可以制作购物清单。...这些全部来自你的终端!它是免费的,是使用 Haskell 语言编写的开源程序。源代码在 GitHub 中免费提供,因此你可以复刻它,添加更多功能或改进它。...Cabal 是一个用于下载和编译用 Haskell 语言编写的软件的命令行程序。Cabal 存在于大多数 Linux 发行版的核心软件库中,因此你可以使用发行版的默认软件包管理器来安装它。...为此,请编辑你的 ~/.bashrc: vi ~/.bashrc 添加下面这行: PATH=$PATH:~/.cabal/bin 按 :wq 保存并退出文件。然后,运行以下命令更新所做的更改。

    56620

    C++17,标准库新引入的并行算法

    .为了理解方便,我先介绍一下 Haskell 中相关的内容,之后再回到C++的讲解中....下面是一个 Haskell 的相关示例 (1) 和 (2) 处的代码分别定义了一个整数列表(ints)和一个字符串列表(strings).在 (3) 中,我给整数列表(ints)应用了一个 lambda...我想你也许好奇为什么我要在介绍C++的文章中写这么多 Haskell 的内容(这些内容还颇具挑战性),那是因为两个原因: 你可以知道 C++ 中相应算法的历史 比照 Haskell 的对应方法可以帮助我们理解...Final remarks C++17 新引入的这7个算法有很多重载版本,调用的时候,你可以指定初始元素,也可以不指定初始元素,同样的,你可以指定执行策略,也可以不指定执行策略.你甚至可以在不指定二元运算的情况下调用需要二元运算的算法...CPU核上同时运行(这种情况下,二元运算不可结合的话就会导致错误结果).更深入的一些信息你可以看看这里和这里.

    1.3K20

    从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)

    我在之前已经介绍过编程范型的概念,而事实上,我们到现在为止,纠结在这四门迥异的语言上面,浅看是各种语言特性,深看就是编程范型和思维方法。...Java 和 JavaScript 位列其中,从表中的分别可以看出二者的分别:因为 Java 有线程的概念,可以写并发编程范型的代码;有泛型的定义,可以进行泛型编程;有专门的 Class 类,可以反射和自省...这里提到 “多范型”,其实这个概念定义也不精确,大致来说,除了 Haskell,我们今天讨论的三门其它的语言,都算是多范型的编程语言。例如用 Java 也可以写函数式编程的代码,但是需要避免使用状态。...纵览编程范型之后,再来回顾一下之前几篇的内容,欢迎移步阅读: 《从 Java 和 JavaScript 来学习 Haskell 和 Groovy(引子)》,记载了写这一系列文字的初衷,以及为什么选这几门语言...很多特性都没有涉及,比如 Haskell 的很多高级特性,是因为我觉得我没法写好,就先不写了。

    72910

    每个程序员都该学习的5种开发语言

    转载请注明出处:葡萄城官网 我曾在某处读到过(可能在《代码大全》,但我不敢确定),程序员应该每年学习一门新的编程语言。...我不想我的程序员们花上一整天用Java去写一个读取CSV文件的程序,或者在TCP/UDP端口抓取信息的程序,这是很浪费时间的一件事情。 为什么我在文章中选择这5种语言呢?我的理由简单且实际。...你会学到如果专注于应用层面和代码结构的设计,而不用关心特定系统的细节和内存管理。JVM帮你搞定了后面这些。...虽然有许多函数式编程可供选择,比如Haskell。我选择Scala,因为作为一名Java开发者,我发现学习Scala比Haskell更容易。 有人也可以把学习Haskell当作一个挑战。...作为一名职业开发者,我倾向于把时间投资在那些对我的职业有帮助的事情上。 ? 无论你学习了多少种编程语言,你需要遵从Bob Martin在《代码整洁之道》给出的编码和设计原则,才能成为一名专业的程序员。

    1K40

    一周极客热文:十步完全理解SQL

    SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言、面向对象的程序语言、甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言)。...虽然简单,但是从一个简单的问题可以引入更深的思考。在原文中,讨论了这个简单的程序。 为什么一切都开始于一个类? Java程序是由类组成,一个类包含方法和属性。...“static”是指该方法是类的一部分,而不是对象的一部分。 这是为什么?我们为什么不把一个非静态方法作为程序的入口? 如果方法不是静态的,那么需要创建一个对象后才能使用方法。...③如果你不去编写针对Linux内核的代码,你就是在浪费时间。其实原文作者不这样认为,他通过总结自己的成长经验总结除了四个可行性方法: 编写你自己的操作系统 编写一些内核模块!...笔者认为,是可以从整个系统上着手进行处理,可如果国家能够提高运力,铁道部的人能够改善目前的运输状况,我想也不至于出现现在的情况。

    1.1K80

    Heskell与函数式编程

    函数式编程和命令式编程有本质上的区别,命令式编程是基于冯诺依曼体系的抽象,通俗点来说就是像电脑运作般思考,而函数式编程更多是数学抽象上函数的概念,也就是输入和输出的映射关系。...就一行代码,涉及了三个函数 1)filter :从价格集合中筛选出大于20的价格,形成新的集合 2)map:对1中产生的新集合进行变换处理,这里的处理是每个元素*0.9,也就是打九折 3)sum:对2中产生集合进行求和处理...我的电脑是Windows,在Windows下打开cmd,输入ghci,就能进入编程界面,在这个界面能够进行简单的编码,比如下面: ? 这里简单的进行了一次 3+5的求和操作。...这段代码定义了一个函数findMax,输入两个数字x和y,输出x和y的最大值,这里要注意下haskell内if else语句else是不可或缺的,不像JAVA可以只写if不写else。...写完保存成文件(这里保存为cal.hs),以.hs作为后缀,在对应目录的命令行下面输入 :l 文件名 ? 调用自定义的函数findMax,输入参数1 3,然后就能够看到输出最大值3了。

    1.1K70

    软件质量的黄金准则

    作者 | Gabriel Gonzalez 译者 | 马可薇 策划 | 万佳 在关于软件质量的相关谈论中,我通常会引用一条经验法则。所以,我决定发帖总结一下。...我将其称为“软件质量的黄金准则”,因为它简单明了,并且可以广泛使用。...长久以往,这些开发者在面对热门工具中的问题就会熟视无睹。 举例来说,很长一段时间以来,Haskell 不支持访问资料字段的点语法。...在 Java 中,如果想要修改嵌套结构资料中的数值,只需要将参照变数串起来,例如: a.b.c.d.e = 10 但是,在 Haskell 中则是每多一层,每个等号就会重复之前等号的序列并多一个取值用的函数...这并不意味这 Haskell 社区中的分歧可以得到解决,也许收费贡献者和开源志愿者之间的矛盾是不可调和的,但这个例子仍然说明了未能在源头解决问题对质量的明显影响。

    67520

    Haskell爬虫:为电商运营抓取京东优惠券的实战经验

    实时监控优惠券动态:及时获取京东平台上的最新优惠券信息,可以帮助运营者快速响应市场变化,调整自己的营销策略。二、技术选型:为什么选择Haskell?...Haskell是一种纯函数式编程语言,以其强大的类型系统、惰性求值和高并发能力而闻名。...在本次项目中,我们选择Haskell作为开发语言,主要基于以下几点考虑:类型安全性:Haskell的强类型系统可以有效减少运行时错误,提高代码的健壮性。...五、运行与调试将上述代码保存为Main.hs,然后在终端中运行以下命令:运行后,程序将输出抓取到的优惠券信息,并将其保存到coupons.txt文件中。六、代码优化与扩展1....错误处理在实际应用中,网络请求可能会失败,因此我们需要添加错误处理机制。可以使用try和catch函数来捕获异常。2. 多线程抓取Haskell的并发模型允许我们轻松地实现多线程抓取。

    40500

    智能合约模糊测试器性能优化实战

    然而许多用户注意到,开启覆盖率功能后Echidna运行速度显著变慢(在我的电脑上慢六倍以上)。我的实习任务就是找出执行缓慢的根源并提升Echidna的运行效率。...另一个更简单的问题是慢速函数被重复调用,而实际上只需调用一次并保存结果即可(这是编程中的通用问题,并非Haskell特有)。在调试Echidna时,我需要同时处理这两个问题。...使用分析器只需在编译时添加-prof标志,运行时添加+RTS -p标志即可。然后可以使用专用工具根据生成的纯文本分析文件(本身已很有价值)创建火焰图,示例如下:该火焰图显示了各函数占用的计算时间。...记忆化修复通过代码库排查,我发现一个导致运行缓慢的问题:在每个执行周期中,getBytecodeMetadata函数都会在同一小组合约上重复调用。...结论我非常享受在冬季实习期间参与Echidna代码库的工作。我深入学习了Haskell、Solidity和Echidna,并获得了处理性能问题和大型代码库的宝贵经验。

    11210

    Haskell爬虫:为电商运营抓取京东优惠券的实战经验

    实时监控优惠券动态:及时获取京东平台上的最新优惠券信息,可以帮助运营者快速响应市场变化,调整自己的营销策略。 二、技术选型:为什么选择Haskell?...Haskell是一种纯函数式编程语言,以其强大的类型系统、惰性求值和高并发能力而闻名。...在本次项目中,我们选择Haskell作为开发语言,主要基于以下几点考虑: 类型安全性:Haskell的强类型系统可以有效减少运行时错误,提高代码的健壮性。...五、运行与调试 将上述代码保存为Main.hs,然后在终端中运行以下命令: 运行后,程序将输出抓取到的优惠券信息,并将其保存到coupons.txt文件中。 六、代码优化与扩展 1....错误处理 在实际应用中,网络请求可能会失败,因此我们需要添加错误处理机制。可以使用try和catch函数来捕获异常。 2. 多线程抓取 Haskell的并发模型允许我们轻松地实现多线程抓取。

    36610

    Windwos 安装Pandoc 工具,实现Typora 文档导出为docx

    让我回到使用word写文档实在无法接受。 感觉太笨重了。而typora可以支持将文档导出为docx格式。那么我们就用这个功能就可以了。...但是实际上typora默认并不提供导出docx格式,而是通过一个第三方工具Pandoc来实现的。 就如同我们在Typora中将图片自动导入到远程的图床时使用PicGo软件一样。...我们可以使用Cmd 或 Powershell 命令行工具运行了。 PS:简单理解就是,安装完毕后会自动将环境变量给配置上。所以我们可以通过命令行进行操作Pandoc了。...Typora 添加Pandoc 当我们本地安装好Pandoc之后,就可以将路径配置到Typora中,这样Typora在进行导出为word文档时,就会自动调用相关的转换命令,将我们的markdown文档转换为...word文档了 选择菜单中的文件->导出->导出设置 在打开的界面中 选择:通用 然后将我们的Pandoc安装路径配置到文件夹中 ,由于Typora会自动检测路径,所以我们点击右侧得到文件夹按钮,其实会自动打开到我们的

    3.8K20

    Scala简介和安装

    对于scala这门语言,有人把它当做Java的延伸版,有人把它当做JVM上的C++,有人觉得这是面向对象语言和面向函数语言的简单混合,有人觉得这就是Haskell,而且也还不如Haskell强。...3)Scala代码通过scalac编译成.class文件,然后在JVM上运行,可以无缝使用已有的丰富的Java类库。即Scala的代码会编译成字节码,运行在Java虚拟机(JVM)上。     ...2>添加环境变量 如果安装之后,看到系统环境变量的Path中已经有了scala的环境变量,那么就不需要配置。我在安装的时候,是这种情况。    ...①交互模式     可以通过命令行直接输入scala命令,如下为打印字符到控制台: ?...2、使用IDE开发 在网上看到很多人,为了在eclipse中安装Scala插件而发愁,这里我直接使用的就是带有Scala的eclipse,解压之后配置几个参数就可以使用。

    99160

    数百次采访后,我总结了 2021 年最好用的区块链开发框架

    我花了很多天时间来了解 ConsenSys 和 Ethereum 网站上推荐的每一个框架,想看看哪些框架是 2021 年最好用的。你可以在 GitHub 上看到我对这些平台的实验。...它带有一个 UI,这样你就可以在 GUI 中与区块链和合约交互。看来它有一段学习曲线,我没有花足够的时间来克服障碍,但能看出它的潜力很大。...这就是为什么我想把它放在这里的原因所在,因为我觉得自己还有很多东西没能完全消化。 我希望看到有更多人能尝试这个框架并意识到它的能力。由于我在该项目上花费的时间有限,所以我觉得自己可能无法做到公正评价。...我可以找到关于使用这个平台部署合约的帮助,另外它的简洁也给人留下了深刻印象。如果你正在寻找一个对命令行友好的极简主义框架,那么我建议你也看一下这一款。...它与 Infura 的一项过时特性紧密耦合,因此我们无法在 Kovan 上部署智能合约。它活跃的时候看来是一个非常强大的项目,而且似乎仍然可以在本地开发中使用,但是我不建议用它替代前三个选项。

    76020

    热爱函数式的你,句句纯正的 Haskell【类型篇】

    我们从 wiki 上可以找到以下要点: Haskell 是一种标准化的,通用的纯函数式编程语言,有惰性求值和强静态类型; 在Haskell中,“函数是第一类对象”。..." :r 用来重新导入当前的源代码文件; :cd 改变当前GHCi的路径; Prelude> :cd C:\Users\User\Desktop :edit 用默认的文本编辑器编辑当前导入的文件...也可以新建一个文件:Helloworld.hs 然后 :l 引入,输入 main 运行: Prelude> :l D://ghc-haskell//test.hs *Main> main Hello,...也可以这样直接在命令行中定义: Prelude> let add(x,y) = (x + y) ::Int Prelude> add(1,2) 3 若 T1 或 T2 为函数,那么 T1-> T2 函数可以称为高阶函数...我们在下一小节做更为细致的说明“类型类”~ 类型别名 一个数据的类型可以由多个其他的类型组成,在 Haskell 中,可以用 type 关键字将这些复杂的类型替换成为其他简单的名字; Prelude>

    1.5K30

    c语言和python区别

    编译型和解释型,在编程时的最大区别是必不必要写一个入口函数,在C语言里是 main,而 Python 可以不写。...而解释型语言被诟病得相对较多,比如因为不能事先编译,执行时都要先解释(本质上就是对单行的编译)成机器代码再执行,因此效率低很多。...不过针对这点,Python 现在会像编译型语言一样把第一次执行时产生的字节码(虚拟机器代码)输出到 .pyc 文件,下次若源文件未改变,可直接执行字节码文件,从而提升了运行效率。...另外,解释型语言难以实现静态类型检查,所以容易产生运行时错误,因此相对不适合用来做大项目。其实非要让编译型语言也能支持命令行交互也并非不可能——Haskell就是这样一个异类。...在速度方面, Python编程语言因为历史原因,有一个GIL锁,导致其对多线程支持不够好,运行速度较慢;而C语言很快,C语言是比较底层的语言,运行效率上要优于Python。

    1K20

    代码农民提高生产力

    大家好,又见面了,我是全栈君 俗话说,天下武功。唯快不破。 也就是说要练成天下高手的话,出招速度一定要快,这样才干在江湖上立足。不至于掉了脑袋。...而命令行界面不是谁都能驾驭。有些功能在命令行下要比图形界面下高效N倍。比方我使用git提交文件时都是在命令行下查看哪些文件被改动了,哪些是新加入的。改动的部分是哪些等。...每次都打一串的cd …..非常麻烦,后来我就自己写了一个小工具,能够给指定的文件夹起别名,想要跳到这个文件夹仅仅要敲别名就可以(參见http://www.huangbowen.net/blog/2013...还有我在Windows系统上工作时,也常常编写一些Power Shell脚本。比方一个命令就启动指定的FTPserver,一些小命令用来实现高速在不同项目源代码间切换并运行构建命令等。...比方我用Ruby写了一个插件,能够自己主动把我主站上的博客同步到博客园中的博客来。我使用Groovy给我的Java代码写单元和集成測试,比使用Java语言编写要快非常多。

    42910

    ​在群晖docker上装elmlang可视调试编码器ellie

    代码的执行结果反馈(webpack框架),而elixir负责的是前端(phoenix框架),负责你打开ellie时的那个界面,总之很绕。。。...所以它们被做进ellie这个docker编排逻辑中时,需要安排好几种语言的运行时和库支持 -- 在development版本的docker中可以看到清楚的逻辑,前后端各维持在一套dockerfile build...ENV关于prod的预埋参数所以运行时不会出错,否则比如在非docker构建的情况下,你把mix phx.server单独在命令行中执行,会出现如下错误:(EXIT) no process: the process...留给其它人解决吧(这就是分层文件系统给人理解上带来的极大不便)。反正项目部署到任何支持docker的机器都可以启动并进入ellie所在IP:4000的界面了。...-------- 其实docker就是一个通用的应用和OS的虚拟容器,它可以同时虚拟出我在《DISKBIOS》系列设想中用openvz虚拟出的同时运行的,却又可应用可OS的通用虚拟环境。

    1.5K60

    听君一席话,如听一席话,解释解释“惰性求值”~

    1 一样,但是它实际上实现的却是 JavaScript 示例代码 2 的效果; 在 GHC 编译器中,result1, result2, 和 result3 被存储为 “thunk” ,并且编译器知道在什么情况下...有点像 Promise 的意思,你不告诉我 resolve/reject,我就 pending;Haskell 中,你不告诉我什么时候调用这个值,我就维持 thunk 的状态; 无限列表 在 Haskell...中可以定义一个数组,它的项是无限多的; let infList = [1..] // 定义一个 1,2,3......不断递增的数组; 为什么在 Haskell 中行,在 JavaScript 中不行?...因为前者是对变量 sum 不断进行累加,而后者是: (((((1 + 2) + 3) + 4) + …) + 100000000) 该运行记录中涉及的所有计算都是懒惰的;也就是说,所有单独的数字都同时在内存中

    78420
    领券