论坛首页 综合技术论坛

模式匹配的实现和使用

浏览 2432 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-27  
模式匹配是个老概念了,它并不是函数式编程的必须内容,但函数式语言通常都实现了模式匹配,而大部分的命令式语言都空缺了这一块儿,所以给大家留下的印象就是模式匹配只在函数式编程中出现。

下面是一个常规的Fib编码:

public int fib(int n)
{
  if (n < 2) return 1;
  return fib(n - 2) + fib(n - 1);
}

// 伪代码
public int fib(int n)
{
     PUSH_VARB n
     PUSH_INT 2
     CALC <
     JMPF 0006: POP
     PUSH_INT 1
     RETURN [1]
0006:PUSH_FUNC main::fib
     PUSH_VARB n
     PUSH_INT 2
     CALC -
     CALL [2]
     PUSH_FUNC main::fib
     PUSH_VARB n
     PUSH_INT 1
     CALC -
     CALL [2]
     CALC +
     RETURN [1]
     RETURN
}


再看一下模式匹配的写法:

public int fib(int n ? n < 2) // 要求: n < 2
{
  return 1;
}

public int fib(int n) 
{
  return fib(n - 2) + fib(n - 1);
}

// 伪代码
public int fib(int n)
{
     PUSH_VARB n
     PUSH_INT 2
     CALC <
     JMPF 0007: POP
     PUSH_INT 1
     RETURN [1]
     RETURN
0007:PUSH_FUNC main::fib
     PUSH_VARB n
     PUSH_INT 2
     CALC -
     CALL [2]
     PUSH_FUNC main::fib
     PUSH_VARB n
     PUSH_INT 1
     CALC -
     CALL [2]
     CALC +
     RETURN [1]
     RETURN
}


对比两种编码的伪代码可以看出编译器对模式匹配函数自动添加了检测执行代码并进行了函数合并。一切就是这么简单。

模式匹配通常用于替代函数功能级的复杂分支语句,比如嵌套的if语句或switch语句。它的优点是在语法上实现了代码分离,有新的编码要求时只需增加新匹配模式或者删改已有的匹配模式即可,程序员无须维护一个复杂的分支函数。

下面举一个使用模式匹配的简单例子:

<html>
<head>
<title>查看</title>
</head>
<body>
<% ==> begin CGI
public void display(string table id_field content_field click_field ID)
{
  // 显示内容

  = sys::db().selectStr(@"SELECT %(content_field) FROM %(table) 
    WHERE %(id_field)='%(ID)'").html();

  // 增加点击量

  sys::db().execSQL(@"UPDATE %(table) SET %(click_field)=%(click_field)+1
    WHERE %(id_field)='%(ID)'");
}

// 建立模式匹配
 
public void view(string cate ID ? cate == "news") // 新闻
{
  display("news", "news_ID", "news_content", "news_clicks", ID);
}
 
public void view(string cate ID ? cate == "file") // 文章
{
  display("files", "file_ID", "file_content", "file_view_count", ID);
}
 
public void view(string cate ID ? cate == "msg")  // 消息
{
  display("msgs", "msg_ID", "msg_content", "msg_clicks", ID);
}
 
// 执行模式匹配

view(${request.cate}, ${request.ID}); 
==> END CGI %>
</body>
</html> 


是否使用模式匹配是个习惯问题,也是个经验问题,有时只是老板个人的问题。

从技术上讲,条件越复杂,模式匹配就越有用,这点是可以肯定的。
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics