写完这篇文章后,我决定把钱放在嘴边,并开始转换我以前的项目来使用recursion-schemes
.
有问题的数据结构是惰性 kdtree。请查看具有显式和隐式递归的实现。
这主要是一个简单的转换,大致如下:
data KDTree v a = Node a (Node v a) (Node v a) | Leaf v a
至
data KDTreeF v a f = NodeF a f f | Leaf v a
现在,在对整个 shebang 进行基准测试后,我发现该版本比普通版本慢了KDTreeF
大约两倍(在此处找到整个运行)。
只是额外的Fix
包装让我在这里放慢了速度吗?有什么我可以做的吗?
注意事项:
- 目前这是专门用于(V3 Double)的。
- 这是 cata-after 变形应用。Hylomorphism 不适用于 kdtree。
- 我用
cata (fmap foo algebra)
了好几次。这是好习惯吗? - 我使用 Edwards
recursion-schemes
包。
编辑1:
这有关系吗?https://ghc.haskell.org/trac/ghc/wiki/NewtypeWrappers
不是newtype Fix f = Fix (f (Fix f))
“免费”的吗?
编辑2:
刚刚做了另一组基准测试。这次我测试了树的构造和解构。这里的基准测试:https ://dl.dropboxusercontent.com/u/2359191/2014-05-15-kdtree-bench-03.html
虽然核心输出表明中间数据结构没有被完全删除,并且现在线性搜索占主导地位并不奇怪,但现在KDTreeF
s 比KDTree
s 略快。不过也没关系。