类型与系统_风闻
code2Real-有人就有江湖,有code就有bug2021-12-02 17:30
学haskell函数式编程,类型是绕不过去的坎。
软件工程的概念已经提出了几十年了,但是因为没有银弹,所以软件工程不是一个放之四海而皆准的真理。
专家的意见是,软件之所以难以处理复杂系统,主要是抽象能力不足。
抽象能力不足体现在“盲人摸象”上,只见局部,难以获得整体的感觉,因此不知道何处下手能达到疱丁解牛的效果。
疱丁因为对牛很熟悉了,所以动刀时势如破竹,刀锋未到,竹子已经裂开了。
因为是先学了LISP,所以在学haskell时有点痛苦。
LISP通过抽象语法树(AST)实现抽象。
LISP的语言最简单,只有7种结构,LISP的本质是用list表示语法树。
LISP的本名就是表处理语言:List Processing language。
LISP用“表”表达万物,对“表”的操作就是对万物的操作。
haskell是一个完全不同的思维模式,它以类型的视角看待万物。
这有点象数学的群论,群论把所有的运算,如+-*/都视为一种操作类型,研究这些操作的结果是否满足自反、传递等特性,是否有逆元,是否有零元,是否满足结合律交换律。
群论还是初级的抽象代数,后面还有更抽象的,如范畴论等。
中国古人说:非我族类,其心必异。
近代科学本质上是分类学,针对不同的类型,有不同的措施。
类型是编译技术的酵母,否则无法消化复杂的语法系统。
中国人受传统文化影响,早已经习惯了简单的分类。
如二元思维,阴阳思维,非黑即白思维。
中国人崇尚大道至简,而西方因为历史比较短,加上有技术工具,所以不厌其烦地细分类型。
近代西方将分类推广到极致,形成非常复杂的分类系统。
其中,有进步也有退步。例如,菲律宾土著孩子可以识别3000种野生药物,而英国医科大学博士只能识别900种野生药物。
说得极端的例子,中国将性别分为男女两种。但是西方白左将性别分为56种。
刚开始时,我以为自己眼花了,是不是作者笔误,把中国56个民族搬到西方文献中了。
haskell是纯函数式编程,水至清而无鱼,越是纯的东西,工程上就越是不方便使用,所以haskell在学术上用得比较多。
haskell在类型上B格还不够,不支持depent type。
Idris支持depent type,在类型处理能力上达到一个顶峰。
但是,抽象层次还不够。
编程的目标要达到老子在《道德经》中所说的那样:天得一而清,地得一而宁。
对老子而言,万物抽象成“一”,则无往而不利。就象手中有锤子,把所有的问题都看成钉子。
对于用户而言,他们的要求就是“一”,但是对于程序员而言,到达那个“一”之前,需要在代码的沼泽中艰难地迈开双腿。