Haskell GHC:模式与N个构造函数匹配的时间复杂度是多少?

时间:2012-01-27 00:12:08

标签: haskell compiler-construction pattern-matching complexity-theory

假设我们有以下Haskell:

data T = T0 | T1 | T2 | ... | TN

toInt :: T -> Int
toInt t = case t of
  T0 -> 0
  T1 -> 1
  T2 -> 2
  ...
  TN -> N

这里使用什么算法来执行模式匹配?我看到两个选择:

(1)线性搜索,类似

if      (t.tag == T0) { ... }
else if (t.tag == T1) { ... }
else ...

(2)二进制搜索,这在此特定任务中是明智的:在集{t.tag ... TO}中搜索T1023。但是,在模式匹配通常具有许多其他功能和概括的情况下,可能不会使用它。

使用GHC进行编译,使用什么算法,以及ttoInt上的模式匹配,以N为单位的时间复杂度是什么?

1 个答案:

答案 0 :(得分:31)

使用跳转表,使模式匹配为恒定时间操作。

不幸的是我无法找到最新的引用,尽管this page提到将Cmm级switch语句的实现作为跳转表,而this old tagging design document使用以case上的Bool为例,生成跳转表。