Влияние на производительность при использовании GADT

Когда отвечал на вопрос с предложением использовать 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, я никогда особо не задумывался об аспектах производительности. Может ли кто-нибудь рассказать мне больше об этом (и о любых других скрытых затратах, о которых я могу не знать)?

9
задан Community 23 May 2017 в 12:33
поделиться