使函数式编程神秘化(在一家真实公司中)
多年以来,我们所有人都对在现实生活中的项目中使用函数式编程持怀疑态度。 在我们看来,大多数这种怀疑源自于这样的观念,即函数式编程无法访问,过于学术化或者不是非常有用。 我们听到的一些例子: “这太难了-我学习这门课时几乎没学过”; “这是一个很酷的理论,但是没有实际应用,也不适合商业项目”; “我应该如何避免现实世界中的副作用? 我们所做的一切在某种程度上都需要副作用”; “我们无法在公司雇用具有这些技能的人员”; “什么? 我应该在日常工作中使用单子吗?” 每个语句都包含一个事实,但是Nubank在大规模生产中使用函数式编程,并且我们认为这种范例比通常理解的更容易学习并且更有用。 这些担忧中有许多是因为函数式编程定义的确很广泛。 这里的关键是使用使您的生活更轻松的部件 。 在本文中,我们尝试提出一些要点,这些要点使我们在Nubank构建高度可用和可扩展的分布式系统时更加轻松。 这是现代函数式编程语言的一个杀手((常常被误解)功能。 但是,当我们拥有的是不变的“事物”时,我们应该如何更新属性? 我们是否每次都要制作一个新副本? 那不是太贵了吗? 要记住的第一件事是:对于不变的数据结构, 复制很便宜 。 您实际上并不需要重复数据,因为您不必这样做。 您所要做的就是指向相同的对象和样式。 让我们看一下在Python和Clojure中更新地图的代码段之间的比较: 上面的代码段将打印{'foo': 'baz', 'something': {'sub': 123}} 。 请注意,初始值会丢失。 现在使用Clojure: Clojure代码段显示{:foo bar, :something {:sub 123}}然后显示{:foo baz, :something {:sub 123}} 。 我们既有新的价值观又有旧的价值观。 assoc,在“ associate”中发音,是一个函数,它将添加或更新“ collection”(在这种情况下为map / dictionary或vector / array)中指定键的值。 如果键已经存在于地图上,它将被替换,如果不存在,则将被添加。 但是,这里发生了神奇的事情:您实际上并没有更改our-immutable-map ; 您正在创建一个与our-immutable-map […]