假设我们有以下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进行编译,使用什么算法,以及t
中toInt
上的模式匹配,以N为单位的时间复杂度是什么?
答案 0 :(得分:31)
使用跳转表,使模式匹配为恒定时间操作。
不幸的是我无法找到最新的引用,尽管this page提到将Cmm级switch
语句的实现作为跳转表,而this old tagging design document使用以case
上的Bool
为例,生成跳转表。