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的值. 而且 ^ 符號只能用在模式匹配中.

相關文章
相關標籤/搜索