2017-07-02 24 views
2

我以前用過Kleisli,當你計算傳遞依賴到它的計算時,monad會返回我需要的值。 現在我正在使用Reader,我發現當我運行該程序時,評估結果將返回Id爲什麼貓在評估讀者時返回`Id [T]`?

爲什麼?

此外,探索Id我遇到的init函數展開計算值的不同選項。使用「combinator」是否好?我需要從Reader唯一的東西是沒有任何包裝的產值。

由於

回答

3

Id被定義爲type Id[A] = A。所以這只是類型本身,你可以使用它,就好像那裏沒有Id一樣。

下面的代碼是有效的:

val s: Id[String] = "123" 
s.charAt(s.length - 1) 

由於cats文檔狀態:

身份,編碼爲type Id[A] = A,方便的別名,以便身份情況良好kinded。

身份monad可以看作是環境monad,它編碼沒有效果的效果。在純環境中,純環境值是Id的值。

例如,cats.Functor實例cats.Id可以讓我們的功能A => B應用到Id[A],並得到一個 Id[B]。然而,Id[A]A相同,所以我們所做的所有 正在將純函數的A => B類型應用於純值 類型A以獲得純值B。即,實例 編碼純粹的一元函數應用程序。

例如,對於Reader它更方便地將其定義爲:

type Reader[A, B] = ReaderT[Id, A, B] 
type ReaderT[F[_], A, B] = Kleisli[F, A, B] 

這允許您定義所有的類型類實例的比較複雜的情況下,當F[_]是實實在在的事,只是使用這些當沒有F[_]時(即FId時)更簡單的情況。

+0

謝謝!我沒有注意到類型別名。 –