cats是scala的一個(gè)新的函數(shù)式編程工具庫,其設(shè)計(jì)原理基本繼承了scalaz:大家都是haskell typeclass的scala版實(shí)現(xiàn)。當(dāng)然,cats在scalaz的基礎(chǔ)上從實(shí)現(xiàn)細(xì)節(jié)、庫組織結(jié)構(gòu)和調(diào)用方式上進(jìn)行了一些優(yōu)化,所以對(duì)用戶來說:cats的基礎(chǔ)數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)在功能上與scalaz是大致相同的,可能有一些語法上的變化。與scalaz著名抽象、復(fù)雜的語法表現(xiàn)形式相比,cats的語法可能更形象、簡(jiǎn)單直白。在scalaz的學(xué)習(xí)過程中,我們了解到所謂函數(shù)式編程就是monadic Programming:即用monad這樣的數(shù)據(jù)類型來構(gòu)建程序。而實(shí)際可行的monadic programming就是用Free-Monad編程了。因?yàn)镕ree-Monad程序是真正可運(yùn)行的,或者說是可以實(shí)現(xiàn)安全運(yùn)行的,因?yàn)樗梢员WC在固定的堆棧內(nèi)實(shí)現(xiàn)無限運(yùn)算。我們知道:函數(shù)式編程模式的運(yùn)行方式以遞歸算法為主,flatMap函數(shù)本身就是一種遞歸算法。這就預(yù)示著monadic programming很容易造成堆棧溢出問題(StackOverflowError)。當(dāng)我們把普通的泛函類型F[A]升格成Free-Monad后就能充分利用Free-Monad安全運(yùn)算能力來構(gòu)建實(shí)際可運(yùn)行的程序了。由于我們?cè)谇懊嬉呀?jīng)詳細(xì)的了解了scalaz的大部分typeclass,包括Free,對(duì)cats的討論就從Free開始,聚焦在cats.Free編程模式方面。同時(shí),我們可以在使用cats.Free的過程中對(duì)cats的其它數(shù)據(jù)類型進(jìn)行補(bǔ)充了解。
cats.Free的類型款式如下:
sealed abstract class Free[S[_], A] extends Product with Serializable {...}
S是個(gè)高階類,就是一種函數(shù)式運(yùn)算。值得注意的是:現(xiàn)在S不需要是個(gè)Functor了。因?yàn)镕ree的一個(gè)實(shí)例Suspend類型是這樣的:
/** Suspend the computation with the given suspension. */ private final case class Suspend[S[_], A](a: S[A]) extends Free[S, A]