Scala中的泛型编程和烂香蕉涉及功能依赖

Mzk*_*evi 5 generics recursion haskell scala

因此,仅为了初学者(不一定要排除我自己)的情境化,仿函数是A级上下文/映射抽象.在Scalanese:

trait FunctorStr[F[_]] {
    def map[A, B](f: A => B): F[A] => F[B]
 }
Run Code Online (Sandbox Code Playgroud)

很多东西都是算子等等,现在如果你对通用编程和DSL制作感兴趣,那么设计模式的算子会出现很多.因此,为了与扩展直觉的主题保持一致,让我们深入了解它.在comonad.com的Rotten Bananas中途,我们被介绍到Cata班

在Haskellese中给出:

class Cata f t | t -> f where
  cata:: (f a -> a) -> t -> a
Run Code Online (Sandbox Code Playgroud)

现在这个班级已接近我们读者的乐趣之初,但对我而言,scala实施者...... Cata是我们麻烦的开始

这个函数依赖 t -> f是否意味着"f由t唯一确定"?如果你在2011年问过Miles Sabin, 那么fundep模式在scala中完全可以实现,并且只需要通过隐式参数部分启动隐式搜索并见证类型来解决搜索,但我不能说我得到它以便立即翻译t -> f斯卡拉

我在scala中看到它就像是

abstract class Cata[F[_], T](implicit e: ???) {
   def cata[A]: (F[A] => A) => T => A
}

trait CataFunctor[F[_]] extends FunctorStr[({type l[x] = Cata[F, x]})#l] {
   def map[A, B](f: A => B): Cata[F, A] => Cata[F, B]
}
Run Code Online (Sandbox Code Playgroud)

引用文章:

给定cata和fmap可以通过并建立一整套其他递归方案,paramorphisms,zygomorphisms,histomorphisms,generalized catamorphisms,...; 动物园是非常令人生畏的,这些可以用来撕裂协变的仿函数而不顾一切地放弃.借助于paramorphism的力量,你重新获得了一般递归的概念,因此你基本上可以编写你想要的任何递归函数.(在房子的代数边上有变形,同态​​和各种其他有效生成协变仿函数的野兽)

这就是我寻求的力量.

我正在努力解决这个问题并且真的想要一些帮助吗?现在我已经在scalaz中实现了InvariantFunctor,所以我知道这不是一个傻瓜差事.

我可以在这里轻推方向吗?我想尽可能多的细节,所以,坚持下去.

Lee*_*Lee 2

阅读链接的帖子,您似乎需要:

trait CataDep[T, F[_]]

abstract class Cata[F[_], T](implicit e: CataDep[T, F]) {
   def cata[A]: (F[A] => A) => T => A
}
Run Code Online (Sandbox Code Playgroud)