Elixir 函数编程的几个基本特性

一级函数(First-Class Functions)

什么是一级函数? 下面的链接是知乎一篇问答给出的解释, 原文连接:
https://www.zhihu.com/question/27460623/answer/36747015html

  • 一级的(first class)
    该等级类型的值能够传给子程序做为参数,能够从子程序里返回,能够赋给变量.大多数程序设计语言里,整型,字符类型等简单类型都是一级的.shell

  • 二级的(second class)
    该等级类型的值能够传给子程序做为参数,可是不能从子程序里返回,也不能赋给变量.编程

  • 三级的(third class)
    该等级类型的值连做为参数传递也不行.网络

有了这个基础知识, 下面对于高阶函数,闭包的理解就更容易了.闭包

高阶函数(Higher-Order Functions)

Elixir不只容许你把函数放入变量, 还容许你把函数做为参数传递给另外一个函数. 在数学中, 一个高阶函数一般是一个接受一个或多个函数做为输入 或者 同时也返回一个函数做为输出的函数. 这个特性使Elixir语言很是强大.并发

iex> square = fn x -> x * x end
#Function<6.17052888 in :erl_eval.expr/5>
iex> Enum.map(1..10, square)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

上面定义了一个匿名函数, 它接受一个数字, 求平方值并赋值给 square 变量. 而后使用 Enum.map 对数字列表 1..10 中的每个数字计算平方值.ide

注: 关于 1..10 请参考 Range. 函数

高阶函数参考资料:设计

闭包(Closures)

闭包有以下几个特性:

  • 能够传递, 做为参数或做为返回值

  • 它能记住当闭包函数建立时做用域中的全部变量(至关于一个符号表快照), 在闭包函数外部调用此函数时, 闭包函数还可以访问建立时做用于中的变量.

iex(1)> outside_var = 5
iex(2)> print = fn() -> IO.puts(outside_var) end 
iex(3)> outside_var = 6
iex(4)> print.()
5

能够看到, 即便修改了 outside_var 的值, 但结果任然是 5.

不可修改的状态(Immutable )

正是因为这个特性使Erlang消除了并发编程中同一时刻访问全局变量的竞太条件, 这也是Erlang做为开发并发系统的首选语言之一.

看下面的例子:

iex> tuple = {:ok, "hello"}
{:ok, "hello"}
iex> put_elem(tuple, 1, "world")
{:ok, "world"}
iex> tuple
{:ok, "hello"}

是的, 你仍可以给一个变量从新赋值.

defmodule Assignment do
    def change_me(string) do
        string = 2
    end
end

关于^(Pin)操做符

正常状况下给变量绑定一个值(或者在其余语言中成为赋值)操做以下:

name = "developerworks"

这里的name为一个变量, "developworks"为其值.

那么关于 ^, 一个更容易理解的方式, 能够认为是 ^name 是获取 name的值. 而且 ^ 符号只能用在模式匹配中.

相关文章
相关标签/搜索