Когда отвечал на вопрос с предложением использовать GADT , в комментариях возникли некоторые вопросы, касающиеся производительности. Вопрос касался класса типов PlotValue
:
class PlotValue a where
value :: a -> Double
, и в моем ответе предлагалось использовать GADT Input
:
data Input where
Input :: (PlotValue a, PlotValue b) => Maybe a -> Maybe b -> Input
, но детали, я полагаю, несущественны.
I ' Возникают ли какие-либо затраты времени выполнения при сопоставлении с образцом, например
case x of
Input (Just a) (Just b) -> value a * value b
_ -> 0.0
, сверх обычных затрат, связанных с двумя значениями Maybe
?
Пробел :
Сколько накладных расходов на хранилище несет значение типа Input
? Я предполагаю, что он содержит два словаря PlotValue
для каждого значения типа Input
(каждый «указатель»?), Что означает, что [Input]
будет гораздо более неэффективным с точки зрения использования памяти, чем использование (Just Double, Just Double)
или, еще лучше, (# #Double, #Double #)
- если вы сохранять результаты значения
в обычном или распакованном кортеже.
Итак, хотя мне нравится выразительность, которую дают мне GADT, я никогда особо не задумывался об аспектах производительности. Может ли кто-нибудь рассказать мне больше об этом (и о любых других скрытых затратах, о которых я могу не знать)?