• 函数式编程里的模式匹配

    更少的代码做更多的东西
    服务器君一共花费 172.804 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    模式匹配不是什么新的创新特性,事实上,它和函数式编程的关系不大。把产生模式匹配归因于函数式编程的唯一的原因是函数式语言早就提供了模式匹配,然而现在的命令式语言还大多做不到。

    让我们用一个例子深入了解一下模式匹配。这是一个 Java 的 Fibonacci 函数:

    int fib(int n) {
        if(n == 0) return 1;
        if(n == 1) return 1;
    
        return fib(n – 2) + fib(n – 1);
    }
    

    让我们用 Java 衍生出的函数式语言来支持模式匹配:

    int fib(0) {
        return 1;
    }
    
    int fib(1) {
        return 1;
    }
    
    int fib(int n) {
        return fib(n – 2) + fib(n – 1);
    }
    

    两者有什么区别?编译器为我们实现了分支。这有什么大不了?的确没什么,有人注意到很多函数包括了复杂的 switch 语句(尤其是在函数式程序中)所以认为这种抽象形式很好。

    我们把一个函数定义分离成多个,然后把模式置于参数中(有点象重载)。当这个函数被调用时,编译器比较传入参数和函数定义然后选择其中正确的一个,这一般是通过选择可选的最特定的定义来完成。例如,int fib(int n) 可以在 n 等于 1 时被调用,但是实际上 fib(n) 没有被调用,因为 fib(1) 更加特定。

    模式匹配通常要比我这个例子复杂,比如,高级模式匹配系统可以让我们这样做:

    int f(int n < 10) { … }
    int f(int n) { … }
    

    模式匹配什么时候适用?情况太多了!每当你有一个嵌套着 if 的复杂的数据结构,这时就可以用模式匹配以更少的代码完成得更好。一个很好的例子闪现在我脑海,这就是所有 Win32 平台都提供了的标准的 WinProc 函数(即使它通常被抽象了)。通常模式匹配系统能检测集合也可以应付简单的值。例如,当传给函数一个数组后,就可以找出所有首元素为 1 第三个元素大于 3 的所有数组。

    模式匹配还有一个好处:如果需要增加或修改条件,那么不必对付一个巨大的函数,只需增加或修改适合的定义即可,这消除了“四人帮”(GoF)书中的一大类设计模式。条件越复杂,模式匹配就越有用,一旦习惯了它,你就会担心没有了模式匹配的日子如何打发。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android根基概念Context 8 个条目
  2. [软件工程与项目管理] 浏览器的HTML解析器 8 个条目
  3. [移动开发] Android与SQLite数据库 7 个条目
  4. [移动开发] Android 开发调试工具 ADB 3 个条目
  5. [Python程序设计] Django Web环境配置 2 个条目
  6. [Python程序设计] urls.py设置技巧 8 个条目
  7. [移动开发] Android开发基础知识 4 个条目
  8. [PHP程序设计] 对输入文件类型的检测 1 个条目
  9. [Python程序设计] Django模板系统 11 个条目
  10. [Python程序设计] Tornado源码解析 23 个条目
  11. [搜索引擎优化] 与百度权重有关的信息 2 个条目
  12. [软件工程与项目管理] 了解一点WebKit 9 个条目
窗口 -- [协会]