簡體   English   中英

為什么Haskell中沒有`Cofunctor`類型類?

[英]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不存在的原因。 “'一般功能'的雙重概念仍然是'一般功能'”。

由於FunctorCofunctor相同,因此使用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)

實際上,您錯了:只有一個!

https://hackage.haskell.org/package/acme-cofunctor

以供參考,

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

請注意,給定的extractextend可以生成fmapduplicate ,給定return>>=可以生成fmappure<*>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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM