我以前用過Kleisli
,當你計算傳遞依賴到它的計算時,monad會返回我需要的值。 現在我正在使用Reader
,我發現當我運行該程序時,評估結果將返回Id
。爲什麼貓在評估讀者時返回`Id [T]`?
爲什麼?
此外,探索Id
我遇到的init
函數展開計算值的不同選項。使用「combinator」是否好?我需要從Reader
唯一的東西是沒有任何包裝的產值。
由於
我以前用過Kleisli
,當你計算傳遞依賴到它的計算時,monad會返回我需要的值。 現在我正在使用Reader
,我發現當我運行該程序時,評估結果將返回Id
。爲什麼貓在評估讀者時返回`Id [T]`?
爲什麼?
此外,探索Id
我遇到的init
函數展開計算值的不同選項。使用「combinator」是否好?我需要從Reader
唯一的東西是沒有任何包裝的產值。
由於
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[_]
時(即F
爲Id
時)更簡單的情況。
謝謝!我沒有注意到類型別名。 –