使用类型族进行级别计算?
根据Monad Reader的第8期文章,我使用函数依赖和类型系列对“即时疯狂”难题进行了类型级解决方案编码:
fundeps解决方案大约需要200秒。 而类型系列版本在大约800秒内完成。
有没有什么技术可以让我的家族版更有效地运行?
我已经为您的两个片段添加了main
的以下定义,以便解决方案显示在类型错误消息中,抱怨缺少Show
实例:
-- fundeps.hs
{-# OPTIONS_GHC -fcontext-stack=400 #-}
main = print $ solutions (undefined :: Cubes)
-- families-open.hs
{-# OPTIONS_GHC -ftype-function-depth=400 #-}
data Proxy a = Proxy
main = print (Proxy :: Proxy (Solutions Cubes))
并使用GHC 7.8.3进行编译以获得一些基准时间:
fundeps.hs
:23s families-open.hs
: families-open.hs
我发现只是将类型族版本转换为使用封闭类型族(代码在这里)可以加快速度,以便分化差异:
families-closed.hs
: families-closed.hs
我认为我可以通过使用DataKinds
(代码在这里)为类型族提供严格的种类来加速它,但令人惊讶的是,这让我回到了DataKinds
:
families-closed-datakinds.hs
: families-closed-datakinds.hs
但是,至少它会生成所有四个版本中最具可读性的输出:
No instance for (Show
(Proxy
'['['Cube 'G 'B 'W 'R 'B 'G, 'Cube 'W 'G 'B 'W 'R 'R,
'Cube 'R 'W 'R 'B 'G 'R, 'Cube 'B 'R 'G 'G 'W 'W],
'['Cube 'G 'B 'R 'W 'B 'G, 'Cube 'R 'R 'W 'B 'G 'W,
'Cube 'R 'G 'B 'R 'W 'R, 'Cube 'W 'W 'G 'G 'R 'B],
'['Cube 'G 'W 'R 'B 'B 'G, 'Cube 'W 'B 'W 'R 'G 'R,
'Cube 'R 'R 'B 'G 'W 'R, 'Cube 'B 'G 'G 'W 'R 'W],
'['Cube 'G 'R 'W 'B 'B 'G, 'Cube 'R 'W 'B 'G 'R 'W,
'Cube 'R 'B 'R 'W 'G 'R, 'Cube 'W 'G 'G 'R 'W 'B],
'['Cube 'G 'R 'B 'B 'W 'G, 'Cube 'W 'W 'R 'G 'B 'R,
'Cube 'R 'B 'G 'W 'R 'R, 'Cube 'B 'G 'W 'R 'G 'W],
'['Cube 'G 'W 'B 'B 'R 'G, 'Cube 'R 'B 'G 'R 'W 'W,
'Cube 'R 'R 'W 'G 'B 'R, 'Cube 'W 'G 'R 'W 'G 'B],
'['Cube 'G 'B 'B 'W 'R 'G, 'Cube 'W 'R 'G 'B 'W 'R,
'Cube 'R 'G 'W 'R 'B 'R, 'Cube 'B 'W 'R 'G 'G 'W],
'['Cube 'G 'B 'B 'R 'W 'G, 'Cube 'R 'G 'R 'W 'B 'W,
'Cube 'R 'W 'G 'B 'R 'R, 'Cube 'W 'R 'W 'G 'G 'B]]))
因此,至少有一种技术可以用来加速代码,即使用封闭类型的系列 。
截至2014年12月的性能数据更新
正如我之前评论过的,我也在GHC 7.9开发线上尝试了这些相同的程序,并发现了一些严重的性能衰退。 这导致了一个GHC错误票据,现在已经解决了令人瞩目的结果:涉及类型系列的所有三种解决方案将快得多,以便对即将发布的GHC 7.10版本进行类型检查!
新的时间数据(如GHC a225c70
)如下:
families-open.hs
:7s families-closed.hs
:6.5s families-closed-datakinds.hs
: families-closed-datakinds.hs
考虑到我正在进行这些测试,没有任何严格的要求, 上述三个时间点应该被认为是相等的,这意味着我肯定会用封闭类型家庭+ datakinds方法作为最常用的类型,并且生成最好的输出。
链接地址: http://www.djcxy.com/p/82217.html