通用编程& Scala中的腐烂香蕉涉及功能依赖性

时间:2014-05-21 19:37:52

标签: scala generics haskell recursion

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

trait FunctorStr[F[_]] {
    def map[A, B](f: A => B): F[A] => F[B]
 }
很多东西都是算子等等,现在如果你对通用编程和DSL制作感兴趣,那么设计模式的算子会出现很多。因此,为了与扩展直觉的主题保持一致,让我们深入了解它。在comonad.com's Rotten Bananas的中途,我们被引入Cata课程

在Haskellese中给出:

class Cata f t | t -> f where
  cata:: (f a -> a) -> t -> a

现在这个课程已接近读者的乐趣,但对我来说,scala实现者...... Cata是我们麻烦的开始

这个函数依赖t -> f是否意味着“f由t唯一确定”? 如果你问Miles Sabin in 2011 fundep模式完全可以在scala中实现,并且简单地涉及通过隐式参数部分启动隐式搜索并见证类型以解决搜索但我不能说我得到它以便立即将t -> f转换为scala

我在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]
}

引用文章:

  

给定cata和fmap可以通过并构建一个完整的主机   其他递归方案,paramorphisms,zygomorphisms,histomorphisms,   广义的catamorphisms,...;动物园是非常令人生畏的   这些可以用来撕裂协变仿函数鲁莽   放弃。借助于一种共生的力量,你重新获得了这种观念   一般递归,所以你基本上可以写任何递归   你想要的功能。 (在房子的代数边有   anamorphisms,apomorphisms,和各种其他动物   有效地生成协变函子)

这就是我寻求的力量。

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

我可以在这里轻推方向吗?我很沮丧,所以请坚持下去。

1 个答案:

答案 0 :(得分:2)

阅读您需要的链接帖子:

trait CataDep[T, F[_]]

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