函数式编程关心数据的映射,命令式编程关心解决问题的步骤
我想稍微改一下,使其更数学化一点。
函数式编程关心类型(代数结构)之间的关系,命令式编程关心解决问题的步骤
函数式编程中的lambda可以看成是两个类型之间的关系,一个输入类型和一个输出类型。lambda演算就是给lambda表达式一个输入类型的值,则可以得到一个输出类型的值,这是一个计算,计算过程满足 -等价和 -规约。
函数式编程的思维就是如何将这个关系组合起来,用数学的构造主义将其构造出你设计的程序。
用Haskell来说,这个关系就是运算符(->),其表示了一个lambda演算的类型,在值的层面和符号‘\‘一起构造了一个lambda表达式。空类型()、积类型(a, b)与和类型Either a b是最基本的数据类型的构造,其和curry和uncurry一起,还有米田定理、伴随函子,使得我们可以构造任意复杂的数据类型和程序。比如Functor、Applicative、Monad/Comonad、Limit/Colimit、End/Coend、Left Kan Extenstion/Right Kan extension等。
具体的程序构造例子可以看我的回答