[英]Why there is no `Cofunctor` typeclass in Haskell?
Monad從Functor
類型類獲取fmap
。 為什么comonads不需要在Cofunctor
類中定義的cofmap
方法?
Functor
定義為:
class Functor f where
fmap :: (a -> b) -> (f a -> f b)
Cofunctor
可以定義如下:
class Cofunctor f where
cofmap :: (b -> a) -> (f b -> f a)
因此,兩者在技術上都是相同的,這就是為什么Cofunctor
不存在的原因。 “'一般功能'的雙重概念仍然是'一般功能'”。
由於Functor
和Cofunctor
相同,因此使用Functor
定義單子和共母。 但是不要讓那讓您認為單子和共母是同一回事,它們不是。
將單聲道定義為(簡化)為:
class Functor m => Monad where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
comonad(再次簡化)是否為:
class Functor w => Comonad where
extract :: w a -> a
extend :: (w a -> b) -> w a -> w b
注意“對稱性”。
另一件事是逆函子,定義為:
import Data.Functor.Contravariant
class Contravariant f where
contramap :: (b -> a) -> (f a -> f b)
實際上,您錯了:只有一個!
以供參考,
class Functor w => Comonad w where
extract :: w a -> a
duplicate :: w a -> w (w a)
extend :: (w a -> b) -> w a -> w b
instance Applicative m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
join :: Monad m => m (m a) -> m a
請注意,給定的extract
和extend
可以生成fmap
和duplicate
,給定return
和>>=
可以生成fmap
, pure
, <*>
和join
。 因此,我們可以只關注pure
+ >>=
並extract
+ extend
。
我想你可能正在尋找類似的東西
class InverseFunctor f where
unmap :: (f a -> f b) -> a -> b
由於Monad
類使“放入”變得容易,而僅允許一種假設的方法“取出”,而Comonad
做了與之相反的事情,因此您的請求最初聽起來很明智。 但是, >>=
和extend
之間存在明顯的不對稱性,這將妨礙定義unmap
的任何嘗試。 請特別注意>>=
的第一個參數的類型為ma
。 extend
的第二個參數的類型為wa
- 不是 a
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.