实用"函数式"编程范式

发布时间 2023-11-19 19:43:02作者: ffl

实用"函数式"编程范式

通常说函数式编程,可能就会提到 map / reduce, 或者函数编程语言,例如 lisp, Haskell 等。

我以前读过一篇文章,具体链接找不到了,作者的观点是函数式编程具体体现在通过函数编程可以直观得看到逻辑调用链条之间的关系。

例如下面这段代码:

p = a(
	b,
	c,
	d,
	e(
		f,
		g
	)
)

p(arg1, arg2, ..., argn)

这个代码片段,表明了整个程序是如何组织在一起,p程序通过将一组函数a,b,c,d,e,f,g 有层次的组合在一起,构成了程序p,最后一次性调用程序p。这样我们就可以在局部直观地看到逻辑模块的组织关系。

如果非常严格的写下去,就会是函数式编程语言的那种代码风格,例如 scheme。对于写命令式编程、OOP编程语言来说这不切实际,但是可以在局部做到这点。例如在C里面把a、b、c、d、e、f、g函数都实现了后,实际的代码组织放在一起:


void run(){
	e(f(), g());

	d();
	c();
	b();

	a();
}

这样实际上看到的是命令式代码,但是至少做到了在run里面局部把逻辑模块的层次依赖组织好。

如果在面向对象语言里,则可能是这样的:

struct T{
	void run(){
		this.e(this.f(), this.g();
		this.d();
		this.c();
		this.b();
	}
}

此外对于C++,可以通过函数对象的方式来把类看成一个函数来用:

struct E{
	operator()(){
		
	}
}

struct F{
	operator()(){
		
	}
}
...


p = A(B(),C(),D(),E(F(), G());
p(...);

在Python里面也可以这样做:

class E:
	def __init(self):
		...

	def __call__(self):
		...

...

p = A(B(),C(),D(),E(F(), G());
p(...);

简单来说,实用函数式编程记住两点:

  1. 可以通过语言的仿函数能力,将对象转成函数
  2. 组合函数对象,清晰表达出逻辑模块的组装
  3. 一次性执行组合程序

--end--