C 语言矩阵乘法伪代码如下:
mat matMul(mat x, mat y){mat result = new mat(x.rows, y.cols);for (int i = 0; i < x.rows; ++i){for (int j = 0; j < y.cols; ++j){result[i][j] = 0;for (int n = 0; n < x.cols; ++n){result[i][j] += x[i][n]*y[n][j]}}}
}
Haskell 代码如下:
matMul x y =letcol m = [x|x:xs <- m]rights m = [xs|x:xs <- m,length(xs) > 0 ]rowMulMat r [] = []rowMulMat r m = sum(zipWith (*) r (col m)):(rowMulMat r (rights m))in case x of[r] -> [rowMulMat r y](r:rs) -> (rowMulMat r y):(matMul rs y)
运行一下看看效果:
>> matMul [[1,2],[3,4]] [[5,6],[7,8]]
[[19,22],[43,50]]
这几天学习,主观感受,C 语言好比以单个像素为粒度画图,游刃有余,自由度很高,但是工作量肯定很大;Haskell 用大刷子画图,有些任务,比如大面积的涂刷,看上去工作效率特高,但是有些任务,比如一些精细的绘图,就力不从心,费好大劲才能完成。这个例子中,Haskell 代码比 C 语言的要复杂,所以说 Haskell 是否好用,要看问题类型。今天看到一种说法,“Haskell 把一些困难的事情变简单了,同时也把一些简单的事情变复杂了。”,我觉得这种话说法非常贴切。
有人说函数式编程,bug比较少。我觉得根本原因在于,C 语言开发软件工作量大,但是,编程难度小,Haskell 语言代码量小,但是编程难度大。所以,采用函数数编程语言的程序员技术水平相对要高一些,代码质量相对 C、C++、Java、C# 领域的菜鸟们要高一些,这并不奇怪。
另外,矩阵这类数据量比较大的结构,计算过程中需要大量地复制数据,必然严重影响运行效率。不知道 Haskell 这类语言是否有合适的优化编译机制,以便提升运行效率?
函数式编程有一个明显优点,因为没有循环语句,所以不可能在一个函数体内编写很长的代码。这样每个函数的代码实现都会很简短。另外匿名函数,let、where 命令,允许定义局部私有函数。这样,函数运算的逻辑思路容易整理的比较清晰。当然前提条件是,函数、变量命名要确切,对函数式编程语言要非常熟悉。