[Erlang_Question28]使用匿名函数灵活组合不同的case

cowboy_http.erl里面的date1/2 启示:

以前一般写case里都是这样子:

 1 date1(Date) ->
 2     case month1(Date) of
 3         {error,badarg} ->
 4             {error,badarg};
 5         {ok,MonthData} ->
 6             case timer1(MonthData) of
 7                 {error,badarg} ->
 8                     {error,badarg};
 9                 {ok,TimerData} ->
10                     valid_date(TimerData)
11             end
12     end.

如果时间格式里month格式有3种(month1~month3) timer格式也有(timer1~timer3)
 那么组合就有9种,要写成16个函数(date1~date9),最可怕的还是要为这9个函数取一个非常贴切的函数名,这简直无情啊!
 所以我们仿照cowboy_http.erl里面匿名函数的写法:

 1 date(Date,MonthFun,TimerFun,ValidFun) ->
 2     case MonthFun(Date) of
 3         {error,badarg} ->
 4             {error,badarg};
 5         {ok,MonthData} ->
 6             case TimerFun(MonthData) of
 7                 {error,badarg} ->
 8                     {error,badarg};
 9                 {ok,TimerData} ->
10                     ValidFun(TimerData)
11             end
12     end.

更进一步:假如我们现在只需要MonthFun 和TimerFun,不需要ValidFun函数,怎么办?
 可以把month,timer,Valid都改写成date模式,让它更加灵活。

 1 date(Date,MonthFun) ->
 2     MonthFun(Date).
 3
 4 month(MonthData,[]) ->
 5     deal_month(MonthData);
 6 month(MonthData,Fun) ->
 7     case deal_month(MonthData) of
 8         {error,badarg} ->
 9             {error,badarg};
10         {ok,MonthData1} ->
11             Fun(MonthData1)
12     end.
13 timer(TimerData,[]) ->
14     deal_timer(TimerData);
15 timer(TimerData,Fun) ->
16     case deal_timer(TimerData) of
17         {error,badarg} ->
18             {error,badarg};
19         {ok,TimerData1} ->
20             Fun(TimerData1)
21     end.

调用如下:

1 date(Date,
2     fun(DateTemp) ->
3         month(DateTemp,
4             fun(Month1) ->
5                 timer(Month1)
6             end)
7     end).

这个看上去不是很直观,但是在多个组合的调用下却是异常的好用!每一个函数都可以自定义下一要执行的函数。

时间: 2024-10-31 02:02:58

[Erlang_Question28]使用匿名函数灵活组合不同的case的相关文章

魔术常量对文件引入、function handling、递归和迭代【分治】、匿名函数、数组和数组指针内容

1.注意魔术常量被引入的问题a.php中载入b.php[其中b.php中输出魔术常量__FILE__输出的是b.php的路径]魔术常量被编译的顺序要在a中代码进行处理之前[可以理解为魔术常量在引入前的编译过程中就已经被预编译]魔术常量相当于占位符[而不是一个引入文件中的变量][注意魔术常量的处理方式]对文件载入过程的理解进一步[就是文件载入语句在文件中执行时,对被载入文件进行编译和复制(这样保证载入的问题的解决)][另外载入文件的作用域问题:载入文件的作用域取决于被载入的位置(例子就是在func

MyPython-->进阶篇-->匿名函数 装饰器

当我们在传入函数时,有些时候,不需要显示地定义函数,直接传入匿名函数更方便 匿名函数 lambda x :x+x  实际就是 def s(x): return x+x 关键字 lambda 表示匿名函数,冒号前面的x表示 函数的参数 匿名函数有一个限制,就是只能有一个表达式,不用写return ,返回值就是该 表达式的结果 匿名函数没有名字,不必担心函数名冲突 也可以赋值给变量  在调用,也可以返回一个匿名函数 装饰器 在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运

匿名函数、内置函数与模块

一.匿名函数 Python使用lambda来创建匿名函数,不再使用def语句这样标准的形式定义一个函数 lambda只是一个表达式,函数体比def简单很多 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去 lambda函数拥有自己的名称空间,且不能访问自有参数列表之外或全局名称空间里的参数 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率 适合临时的一次性的使用场景 语法:

PHP匿名函数及闭包

匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数,C++的新标准C++0x也开始支持了. 匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数,最常见应用是作为回调函数. 闭包(Closure) 说 到匿名函数,就不得不提到闭包了,闭包是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数,

Javascript的匿名函数与自执行

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 1 2 3 function double(x){        return 2 * x;       } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. 1 var double = new Function('x', 'return 2 * x;'); 第三种: 1

在NewLisp中实现匿名函数的递归

匿名函数在很多语言中的表现形式大概如下: (lambda (n)   (* (+ n 1) (- n 1))) 只有参数列表和函数体,而没有名字.在大部分情况下没问题,但是一旦需要用到递归的话,就有点麻烦了,因为不知道如何去递归的调用一个匿名函数. 在学术界中有一些解决这个问题的办法,其中一个就是Y组合子,但是那个太繁琐,而且难以通过宏自动将一个lambda变成可递归形式,没什么好处. 根据历史经验,目前比较好的办法,就是实现一个操作符,匿名函数通过这个操作符来调用自身: (lambda (n)

python协程函数、递归、匿名函数与内置函数使用、模块与包

目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a.生成器相关python函数.装饰器.迭代器.生成器,我们是如何使用生成器的.一个生成器能暂停执行并返回一个中间的结果这就是 yield 语句的功能 : 返回一个中间值给调用者并暂停执行. 我们的调用方式为yeild 1的方式,此方式又称为生成器的语句形式. 而使用生成器的场景:使用生成器最好的场景就

python 全栈 python基础 (十三)匿名函数 与 内置函数

一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是参数,可以有多个,用逗号隔开:冒号右边的为表达式,需要注意的是只能有一个表达式.由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收.  3.注意点:lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值.lambda 函数不能包含命令,包含

python基础-匿名函数、内置函数、正则表达式、模块

1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): return x + y + z print(func(1,5,2)) 1.2 匿名函数 匿名函数:没有名字的函数,定义的时候不需要函数名:定义匿名函数的关键字是:lambda 特点: 1.没有函数名 2.函数自带return 应用场景: 1.应用于一次性的地方 2.临时使用 salaries={