Подтвердить что ты не робот

Haskell GHC: какова временная сложность совпадения шаблона с конструкторами N?

Скажем, у нас есть следующий 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, какой алгоритм используется и какова временная сложность в терминах N, для сопоставления шаблонов на t в toInt?

4b9b3361

Ответ 1

Используется таблица переходов, позволяющая совпадению шаблонов с постоянной операцией времени.

К сожалению, я не могу найти актуальную цитату для этого, хотя эта страница упоминает о выполнении утверждений Cm-level switch как переход таблицы и этот старый документ по дизайну тегов использует case на Bool в качестве примера, создавая таблицу перехода.