为什么函数式编程很重要?

随着时间的流逝,软件变得越来越复杂,模块化的重要性越来越明显,因为保证小模块的开发,重用和测试更加容易,从而保证了质量并促进了代码维护。但是,模块化产生了新的需求,其中包括改进“胶水代码”,该“胶水代码”由用于连接不同模块的代码组成。函数式编程的主要优点是通过引用透明性使每个模块更易于重用和测试,并通过实现高阶函数和延迟评估更有效地链接它们,从而改善模块化。

使用VAVR库以JAVA编写代码示例,该库实现了大部分功能编程功能。

参照透明

在函数式编程中,函数与数学函数共享其定义,这些函数的主要特征之一是,对于给定的输入参数,它将始终返回相同的值,换句话说,它们消除了其他编程范例中存在的副作用。这导致对函数的调用可以用其值替换,而不会影响执行顺序或执行上下文的其他隐含因素,这迫使创建易于理解,重用和测试的模块。

高阶函数

高阶函数是那些接收或返回一个或多个函数的函数,这允许代码的重用和针对不同类型数据的某些行为的泛化,这仅应重写定义其特定行为的基本函数,以及简短易懂的“胶水代码”。高阶函数的一个基本示例是foldLeft函数,该函数允许将列表的所有元素组合为单个元素,这是由于重复应用了接收列表元素类型的对象作为参数的任何函数的结果。

<span style="color:#f8f8f2"><span style="color:#eff0f9"><code>
  <span style="color:#f39c12">public</span> <span style="color:#f39c12">static</span> <span style="color:#f39c12">void</span> <span style="color:#7ed07e">main</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">String</span><span style="color:#f9690e">[]</span> <span style="color:#f8f8f2">args</span><span style="color:#f9690e">)</span> <span style="color:#f9690e">{</span>
      <span style="color:#f8f8f2">List</span><span style="color:#f9690e"><</span><span style="color:#f8f8f2">Integer</span><span style="color:#f9690e">></span> <span style="color:#f8f8f2">list</span> <span style="color:#f9690e">=</span> <span style="color:#f8f8f2">List</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">of</span><span style="color:#f9690e">(</span><span style="color:#dda0dd">1</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">2</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">3</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">4</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">5</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">6</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">7</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">8</span><span style="color:#f9690e">,</span> <span style="color:#dda0dd">9</span><span style="color:#f9690e">);</span>
      <span style="color:#f8f8f2">Integer</span> <span style="color:#f8f8f2">r</span> <span style="color:#f9690e">=</span> <span style="color:#f8f8f2">list</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">foldLeft</span><span style="color:#f9690e">(</span><span style="color:#dda0dd">0</span><span style="color:#f9690e">,</span> <span style="color:#f8f8f2">Integer:</span><span style="color:#f9690e">:</span><span style="color:#f8f8f2">sum</span><span style="color:#f9690e">);</span> <span style="color:#808080">// 45</span>
  <span style="color:#f9690e">}</span>


  <span style="color:#808080">//codigo de la funcion foldLeft tomado del código fuente de vavr</span>
  <span style="color:#f39c12">default</span> <span style="color:#f9690e"><</span><span style="color:#f8f8f2">U</span><span style="color:#f9690e">></span> <span style="color:#f8f8f2">U</span> <span style="color:#7ed07e">foldLeft</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">U</span> <span style="color:#f8f8f2">zero</span><span style="color:#f9690e">,</span> <span style="color:#f8f8f2">BiFunction</span><span style="color:#f9690e"><?</span> <span style="color:#f39c12">super</span> <span style="color:#f8f8f2">U</span><span style="color:#f9690e">,</span> <span style="color:#f9690e">?</span> <span style="color:#f39c12">super</span> <span style="color:#f8f8f2">T</span><span style="color:#f9690e">,</span> <span style="color:#f9690e">?</span> <span style="color:#f39c12">extends</span> <span style="color:#f8f8f2">U</span><span style="color:#f9690e">></span> <span style="color:#f8f8f2">f</span><span style="color:#f9690e">)</span> <span style="color:#f9690e">{</span>
        <span style="color:#f8f8f2">Objects</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">requireNonNull</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">f</span><span style="color:#f9690e">,</span> <span style="color:#f2ca27">"f is null"</span><span style="color:#f9690e">);</span>
        <span style="color:#f8f8f2">U</span> <span style="color:#f8f8f2">xs</span> <span style="color:#f9690e">=</span> <span style="color:#f8f8f2">zero</span><span style="color:#f9690e">;</span>
        <span style="color:#f39c12">for</span> <span style="color:#f9690e">(</span><span style="color:#f8f8f2">T</span> <span style="color:#f8f8f2">x</span> <span style="color:#f9690e">:</span> <span style="color:#f39c12">this</span><span style="color:#f9690e">)</span> <span style="color:#f9690e">{</span>
            <span style="color:#f8f8f2">xs</span> <span style="color:#f9690e">=</span> <span style="color:#f8f8f2">f</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">apply</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">xs</span><span style="color:#f9690e">,</span> <span style="color:#f8f8f2">x</span><span style="color:#f9690e">);</span>
        <span style="color:#f9690e">}</span>
        <span style="color:#f39c12">return</span> <span style="color:#f8f8f2">xs</span><span style="color:#f9690e">;</span>
    <span style="color:#f9690e">}</span>
</code></span></span>

懒惰评估

没有副作用的好处之一是程序员可以使用惰性评估而不必预见到无限可能的情况。这包括定义一个值的结果,该结果要等到函数执行后才能计算出来程序不需要它,它允许创建行为,例如理论上无限长的数组,在大多数情况下称为流。使用惰性评估的一个示例是使用无限连续的候选者计算数字的平方根,对候选者进行评估,直到找到满足所需精度的候选者为止。

<span style="color:#f8f8f2"><span style="color:#eff0f9"><code>
  <span style="color:#f39c12">public</span> <span style="color:#f39c12">static</span> <span style="color:#f8f8f2">Function1</span><span style="color:#f9690e"><</span><span style="color:#f8f8f2">Double</span><span style="color:#f9690e">,</span> <span style="color:#f8f8f2">Double</span><span style="color:#f9690e">></span> <span style="color:#7ed07e">siguienteCandidato</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">Double</span> <span style="color:#f8f8f2">n</span><span style="color:#f9690e">){</span>
      <span style="color:#808080">/**
       * Formula para calcular la sucesión de candidatos a para la raíz cuadrada de n según el método de Newton-Raphson
       */</span>
      <span style="color:#f39c12">return</span> <span style="color:#f8f8f2">Function1</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">of</span><span style="color:#f9690e">((</span><span style="color:#f8f8f2">anterior</span><span style="color:#f9690e">)</span> <span style="color:#f9690e">-></span> <span style="color:#f9690e">(</span><span style="color:#f8f8f2">anterior</span> <span style="color:#f9690e">+</span> <span style="color:#f9690e">(</span><span style="color:#f8f8f2">n</span> <span style="color:#f9690e">/</span> <span style="color:#f8f8f2">anterior</span><span style="color:#f9690e">))</span> <span style="color:#f9690e">/</span> <span style="color:#dda0dd">2</span><span style="color:#f8f8f2">d</span><span style="color:#f9690e">);</span>
  <span style="color:#f9690e">}</span>

  <span style="color:#f39c12">public</span> <span style="color:#f39c12">static</span> <span style="color:#f8f8f2">Double</span> <span style="color:#7ed07e">calcularRaizCuadrada</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">Double</span> <span style="color:#f8f8f2">n</span><span style="color:#f9690e">){</span>
      <span style="color:#f8f8f2">Stream</span><span style="color:#f9690e"><</span><span style="color:#f8f8f2">Double</span><span style="color:#f9690e">></span> <span style="color:#f8f8f2">s</span> <span style="color:#f9690e">=</span> <span style="color:#f8f8f2">Stream</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">iterate</span><span style="color:#f9690e">(</span><span style="color:#dda0dd">1</span><span style="color:#f8f8f2">d</span><span style="color:#f9690e">,</span> <span style="color:#f8f8f2">siguienteCandidato</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">n</span><span style="color:#f9690e">));</span>
      <span style="color:#f8f8f2">Double</span> <span style="color:#f8f8f2">epsilon</span> <span style="color:#f9690e">=</span> <span style="color:#dda0dd">0.0001d</span><span style="color:#f9690e">;</span> <span style="color:#808080">// Se utiliza para especificar la precisión</span>
      <span style="color:#f39c12">return</span> <span style="color:#f8f8f2">s</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">takeUntil</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">candidato</span> <span style="color:#f9690e">-></span> <span style="color:#f8f8f2">Math</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">abs</span><span style="color:#f9690e">((</span><span style="color:#f8f8f2">candidato</span> <span style="color:#f9690e">*</span> <span style="color:#f8f8f2">candidato</span><span style="color:#f9690e">)</span> <span style="color:#f9690e">-</span> <span style="color:#f8f8f2">n</span><span style="color:#f9690e">)</span> <span style="color:#f9690e"><</span> <span style="color:#f8f8f2">epsilon</span><span style="color:#f9690e">).</span><span style="color:#7ed07e">last</span><span style="color:#f9690e">();</span>
  <span style="color:#f9690e">}</span>

  <span style="color:#f39c12">public</span> <span style="color:#f39c12">static</span> <span style="color:#f39c12">void</span> <span style="color:#7ed07e">main</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">String</span><span style="color:#f9690e">[]</span> <span style="color:#f8f8f2">args</span><span style="color:#f9690e">)</span> <span style="color:#f9690e">{</span>
      <span style="color:#f8f8f2">System</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">out</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">println</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">calcularRaizCuadrada</span><span style="color:#f9690e">(</span><span style="color:#dda0dd">25</span><span style="color:#f8f8f2">d</span><span style="color:#f9690e">));</span> <span style="color:#808080">// 5.000023178253949</span>
  <span style="color:#f9690e">}</span>

</code></span></span>

在前面的示例中,我们还可以观察到高阶函数的第二种情况,它由以下包含由返回另一个函数的函数的候选对象表示。

from:https://dev.to//gustavo94/repasando-artculos-why-functional-programming-matters---1l7i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值