博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Elixir 函数编程的几个基本特性
阅读量:7120 次
发布时间:2019-06-28

本文共 1441 字,大约阅读时间需要 4 分钟。

一级函数(First-Class Functions)

什么是一级函数? 下面的连接是知乎一篇问答给出的解释, 原文链接:

  • 一级的(first class)

    该等级类型的值可以传给子程序作为参数,可以从子程序里返回,可以赋给变量.大多数程序设计语言里,整型,字符类型等简单类型都是一级的.

  • 二级的(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 中的每一个数字计算平方值.

注: 关于 1..10 请参考 .

高阶函数参考资料:

  • Introducting Elixir 第八章

  • 以及网络中各种文档资料, 请自行Google,百度

闭包(Closures)

闭包有如下几个特性:

  • 可以传递, 作为参数或作为返回值

  • 它能记住当闭包函数创建时作用域中的所有变量(相当于一个符号表快照), 在闭包函数外部调用此函数时, 闭包函数还能够访问创建时作用于中的变量.

iex(1)> outside_var = 5iex(2)> print = fn() -> IO.puts(outside_var) end iex(3)> outside_var = 6iex(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    endend

关于^(Pin)操作符

正常情况下给变量绑定一个值(或者在其他语言中成为赋值)操作如下:

name = "developerworks"

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

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

转载地址:http://gksel.baihongyu.com/

你可能感兴趣的文章
[转] js对象监听实现
查看>>
【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
查看>>
mongoDB 3.0 安全权限访问控制
查看>>
电子数字 网易游戏在线笔试 第一题 hihocoder
查看>>
Java 中nextLine()方法没有执行直接跳过解决办法
查看>>
重写和重载
查看>>
本表收录的字符的Unicode编码范围为19968至40869
查看>>
PHP多次调用Mysql存储过程报错解决办法
查看>>
leetcode-680-Valid Palindrome II
查看>>
php用curl获取远端网页内容
查看>>
selenium+python谷歌驱动配置
查看>>
oralce的function处理考勤时间节点以及计算工作时间
查看>>
(三)、一步一步学GTK+之布局
查看>>
43. ExtJs控件属性配置详细
查看>>
ros名称、命名空间和重映射
查看>>
系统进程查看 --- 微软官方出品
查看>>
Python 第三方模块安装出现的问题和解决方案.
查看>>
实验1
查看>>
CF915E Physical Education Lessons(珂朵莉树)
查看>>
洛谷P5050 【模板】多项式多点求值
查看>>