Haskell 学习笔记-08:矩阵乘法——难度不过如此

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 =
    let
        col 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 命令,允许定义局部私有函数。这样,函数运算的逻辑思路容易整理的比较清晰。当然前提条件是,函数、变量命名要确切,对函数式编程语言要非常熟悉。

猜你喜欢

转载自blog.csdn.net/quicmous/article/details/80718022