函数式编程的几个重要概念mashup

一、lambda

     lambda演算通常是指一种数学上的概念,函数式编程中的lambda表达式通常是一种函数:

Lambda 表达式(MSDN C# 编程指南)

 

“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。

所有 Lambda 表达式都使用 Lambda 运算符 => , 该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”。

 

二、function

      Functions are first-class data types in functional programming, so they may be assigned to variables and passed to functions as you would any other piece of data. Functions are, of course, reference types.即高阶函数。

 

三、closure

      closure通常是一种匿名函数,通常其函数体内会引用此函数外部的自由变量,直到此函数被调用时才会在适当的上下文里得到这些自由变量的值,才能使其闭合,因而称为闭包(closure)。

 

四、currying

     [WIKIPEDIA]is the technique of transforming a function that takes multiple arguments (or an n-tuple of arguments) in such a way that it can be called as a chain of functions each with a single argument.

Uncurrying is the dual transformation to currying, and can be seen as a form of defunctionalization . It takes a function f (x ) which returns another function g (y ) as a result, and yields a new function f '(x , y ) which takes a number of additional parameters and applies them to the function returned by f . The process can be iterated if necessary.

 

五、continuation

    一句话地说,就是把函数的返回值重定向到程序的任意需要它的地方。很适用于数据流计算机模型的。参见这个文章http://canonical.javaeye.com/blog/33835。

 

六、monad

     或者叫monadic,参考了数学上的范畴理论(category theory),一句话地说,就是构造函数结构的方式(IODP,即先确定输入输出,再确定数据处理),通常用于处理副作用。

     monadic有两种基本操作:unit 和mult。unit是把某值映射为另一个值的操作,例如identity(me:AnyRef) => me;是返回自身的unit函数。mult是一种组合方式,通常是把unit操作应用多次。

     举个俺在实践中碰到的例子。要从某文件中匹配所有类似如下样式的串(用冒号分割的字母数字串,长度不定),你如何写正则表达式呢(读者可先自己尝试写下)?

sunqihui137138139A

sun123B:qi456:hui789:xyz147258:uvwx15989501111

 

   其实,如果能熟练运用monad理论,这个正则式很容易写的。首先找出正则式中的单位运算--unit。字串构造的unit运算是连接,在Java中可以表示为"A"+"B",那么得到"AB";也即这个+操作符就是unit操作!其次,找出如何mult的组合方式。在Java中,字串"ABC123"可以等价为"A"+"B"+"C"+"1"+"2"+"3" 单位操作+的5次操作,只是把+省略了而已!  

   类似地,上题中的unit操作就是:号了(或许对命令式语言背景读者来说,:号似乎不是运算,但是在Scala中,符号也是种函数,核心库中中也有以:号结尾的函数),mult就是简单地对unit应用多次! 自然地,上题中正确的正则表达式可以写为:(/w+[:]/w+)+。

  看到这,读者应该感到monad的奇妙之处了吧?!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值