在回答问题并提出使用 GADT 的建议时,评论中出现了一些关于性能的问题。这个问题涉及一个类型类PlotValue
:
class PlotValue a where
value :: a -> Double
我的回答建议使用 GADT Input
:
data Input where
Input :: (PlotValue a, PlotValue b) => Maybe a -> Maybe b -> Input
但我想,细节无关紧要。
我想知道性能的两个方面:
时间:模式匹配是否会产生任何运行时成本,例如
case x of
Input (Just a) (Just b) -> value a * value b
_ -> 0.0
超出匹配两个Maybe
值的正常成本?
空间Input
:一个类型的值携带多少存储开销?我的猜测是,它PlotValue
为每个类型的值Input
(每个“指针”?)都携带两个字典,这意味着 a[Input]
在内存使用方面比使用(Just Double, Just Double)
or 效率低得多,或者更好,(# #Double, #Double #)
如果你存储value
正常或未打包元组中的结果。
所以,虽然我喜欢 GADT 给我的表现力,但我从来没有过多地考虑过性能方面。谁能告诉我更多关于这一点(以及我可能不知道的任何其他隐藏成本)?