在写完这篇文章后,我决定付诸行动,将我的一个旧项目转换为使用recursion-schemes。 所涉及的数据结构是懒惰的kdtree。请查看具有显式递归和隐式递归的实现。 这主要是一种沿着以下方向进行的简单转换:data KDTree v a = Node a (Node v a) (N...
我正在尝试学习有关Catamorphism的知识,我已经阅读了维基百科文章和Inside F#博客上该主题系列的前几篇文章。 我了解它是折叠的一般化(即将许多值的结构映射到一个值,包括将值列表映射为另一个列表)。 我发现fold-list和fold-tree是一个典型的例子。 是否能够在C...
我很喜欢以一种通用的方式使用折叠/展开函数来处理范畴学中的catamorphisms/anamorphisms的想法,但我认为它有一个显著的性能缺陷: 假设我们想以范畴化的方式处理树形结构——使用通用的catamorphism function来描述不同的折叠过程: newtype Fix...
许多折叠函数似乎非常简单,主要是用自定义函数替换每个数据构造器,例如: data Bool = False | True foldBool :: r -- False constructor -> r -- True...
从http://research.microsoft.com/en-us/um/people/emeijer/Papers/meijer94more.pdf第3页可知: 一般情况下,猫态射并不满足合成的封闭性。 在什么条件下,猫态射才能组合成一个猫态射?更具体地(假设我正确理解了该...
我迫不及待地希望了解与此SO问题相关的catamorphism:链接 :) 我只练习过《Real World Haskell》教程的开始部分。因此,也许我现在会问太多了,如果是这样,请告诉我应该学习哪些概念。 下面,我引用了维基百科关于catamorphism的代码示例链接. 我想知道您...
我正在阅读维基百科上有关“catamorphisms”(一种函数式编程概念)的文章,目前我已经能够在 F# 中复制 Haskell 的示例,但有一个部分我还没做到:type Algebra f a = f a -> a -- the generic f-algebras newtype...
不用说,在Haskell中的标准构造newtype Fix f = Fix { getFix :: f (Fix f) } cata :: (Functor f) => (f a -> a) -> Fix f -> a cata f = f . fmap (cata ...
最近我发现了一种在Java中以某种迂回的方式来模拟高阶类型的方法,具体实现可以参考highj interface H<F, T> { } 在这里,H编码一个更高阶的类型,它接受一个类型参数F,而F本身需要一个参数T。 现在我想知道,我们能否使用这个实现一些更高级别的构造?例...
最近我终于开始感觉理解“折叠”(catamorphism)了。我在一篇最近的回答中写了一些关于它们的事情,但简单来说,我会说一个类型的折叠过程抽象出了递归遍历该类型值的过程,并且该类型上的模式匹配被实现为每个构造函数的一个函数。虽然我对这一点或者我的上面链接中更长版本的回答有任何修正都表示欢迎...