2014-05-21 47 views
5

所以纔來此情境的門外漢(不一定是自己除外),仿函數是一個檔次的上下文/映射的抽象。在Scalanese:泛型編程和香蕉爛在Scala中涉及函數依賴

trait FunctorStr[F[_]] { 
    def map[A, B](f: A => B): F[A] => F[B] 
} 

很多事情都是仿函數等等等等,現在如果你有興趣在泛型編程和DSL各具特色的設計模式仿函數來了很多。因此,爲了與擴展直覺的主題保持一致,讓我們來回顧一下。通過comonad.com's Rotten Bananas向我們介紹類卡塔

在Haskellese給出半路上:

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

現在這個類是接近的樂趣爲我們讀者的開始,但對我來說,斯卡拉實施者... 卡塔是我們的麻煩

這個函數依賴t -> f意思「F唯一採用t決定」的開始? 如果你問Miles Sabin in 2011 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] 
} 

引用的文章:

給CATA和FMAP可以經過和建立的 其他遞歸方案,paramorphisms,zygomorphisms,histomorphisms, 廣義catamorphisms一大堆,...;這些動物園是相當可怕的,這些可以用來撕裂協同函數與放棄的魯莽 。隨着paramorphism的電源就重新推導 一般遞歸的概念,所以你基本上可以寫任何你想要的遞歸 功能。 (在房子的一側餘代數有 anamorphisms,apomorphisms,並 有效地產生協函子其他各種野獸)

這是我追求的動力。

我想工作了這一點,並會很喜歡一些幫助?現在我已經在scalaz中實現了InvariantFunctor,所以我知道這不是一個傻瓜差事。

我能在這裏正確的方向輕推?我儘可能詳細地描述了這些,堅持下去。

回答

2

閱讀鏈接後,它看起來像你需要:

trait CataDep[T, F[_]] 

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