使用类型族进行级别计算?

根据Monad Reader的第8期文章,我使用函数依赖和类型系列对“即时疯狂”难题进行了类型级解决方案编码:

  • fundeps解决方案:http://lpaste.net/113108
  • 类型家庭解决方案:http://lpaste.net/113113
  • 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.hsfamilies-open.hs
  • 我发现只是将类型族版本转换为使用封闭类型族(代码在这里)可以加快速度,以便分化差异:

  • families-closed.hsfamilies-closed.hs
  • 我认为我可以通过使用DataKinds (代码在这里)为类型族提供严格的种类来加速它,但令人惊讶的是,这让我回到了DataKinds

  • families-closed-datakinds.hsfamilies-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.hsfamilies-closed-datakinds.hs
  • 考虑到我正在进行这些测试,没有任何严格的要求, 上述三个时间点应该被认为是相等的,这意味着我肯定会用封闭类型家庭+ datakinds方法作为最常用的类型,并且生成最好的输出。

    链接地址: http://www.djcxy.com/p/82217.html

    上一篇: level computations using type families?

    下一篇: contract of pandas.DataFrame.equals