函数

先来说说一函数吧。对于大部分编程语言来说,函数是一组语句(准确来说是表达试)的集合。对于这些语言来说,语句是基元。

函数式

对于函数式编程语言函数才是基元。那么,一个函数只干一件事,就是一个表达式。如何执行多条语句?我们总不能全部放到全局域下吧。而且,全局域下,也会只有一个入口点的(我们不要说Common Lisp)。

这样一来,如何在一个函数中处理多条语句就是一个大问题了。

lisp

对于lisp而言,所有都是list,语句也不过是list。那么这样好办了。把所有的语句当成参数传进去,然后参数当做一个list,遍利去运行。这大概就是progn的做法(当然,从编译器层面做的可能性更大,因为这样会比较高效点?)

这个完全依赖于lisp本身的语言特性

Haskell

Haskell不同的lisp,他是有类型的。所以当然不可能像上面的方法来做了。当然,你要是说把所有操作当成lambda封到[]里,然后再去遍利,我也是没有话说。

不过先来看看官方的做法。学过Haskell都知道do语法。而do的核心是单子。这样一来就相当于无限多个函数嵌套了。

先想一下单子的操作符>>=,原型是x >>= f = join $ fmap f x,然后再考虑一下Haskell的函数式特性,我们每一次传递一个新的函数后,只是不断的去整合函数,然后返回一个函数。只有当最后一个参数提交上去的时候才会正式执行。相比于lisp,要优雅得多啊。变量还能向下传递的。可以和let说再见了!

不过可能需要担心一下调用栈吧?好象不用太担心……因为没有人会写那么深的函数吧。呃。。这个博主也有点说不太清楚,嗯。要学的东西还很多。。