有时,我们希望更灵活地决定何时执行函数。有些函数式语言具有柯里化功能,如果传递的参数少于函数需要的参数,就能延迟执行函数。而Elixir可以将函数包装在新函数里并将函数某个参数的值固定下来,以此推迟函数的执行,这称为偏函数。
尽管Elixir可以模拟柯里化(Patrik Storm有一篇文章介绍Elixir函数的柯里化[3]),但这样做并不实用,因为Elixir函数中最重要的参数往往是第一个参数。柯里化要求按顺序传递参数,这使得最后一个参数最重要,因为是它触发函数调用。偏函数不受这种限制,你可以给任何参数位置传递一个固定值,所以它比柯里化更灵活。让我们构建一个偏函数的例子。
这个例子要根据给定的字母表和数字列表生成单词,数字列表按顺序指出了组成单词的字母在字母表中的位置。例如,如果函数接收到字母表"aorxd"和列表[4,1,1,2],则返回字符串"door"。让我们创建一个WordBuilder模块:
在IEx中试试:
代码无法执行。我们不能只传递一个参数给String.at/2,那样Elixir会尝试执行String.at/1,而它不存在。在Elixir中,具有不同元数的函数是不同的函数。我们可以用带闭包的匿名函数构建偏函数,这样我们就能在不调用函数的情况下为函数的参数设置值,从而可以够更灵活地决定何时应该执行函数。让我们在build函数中使用偏应用:(www.xing528.com)
我们用一个带有一个参数的匿名函数包装了String.at/2。然后利用闭包引用alphabet变量,让匿名函数记住了它的值。现在匿名函数只需要位置值就能返回需要的字母了。试一下:
Elixir的偏函数还可以用函数捕获语法来实现,比如:
这段代码与前面的代码效果是一样的。偏函数允许延迟对函数的调用,预先确定函数调用参数中的某些值。它为编程提供了更大的灵活性,帮助解决函数调用的某些参数必须是固定值的问题。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。