2016-01-11 16 views
11

モナドはFunctor typeclassからfmapを得る。コモノドがCofunctorクラスで定義されたcofmapメソッドを必要としないのはなぜですか?次のようになぜHaskellに `Cofunctor`型式がないのですか?

class Functor f where 
    fmap :: (a -> b) -> (f a -> f b) 

Cofunctorを定義することができます:

class Cofunctor f where 
    cofmap :: (b -> a) -> (f b -> f a) 

ので、両方のは技術的に同じであり、Cofunctorが存在していない理由ですよう

+4

。両者には違いはありません。しかし、モナドとコモナドは異なっている。しかし、contravariant f =>(a - > b) - > f b - > f a'という型を持つ 'contramap'メソッドを持つ反変なファンクタのようなものがあります。しかし、それはcofunctorと同じではありません。 –

+0

ファンクタの二重引用符(これは単なるファンクタなので、自己二重であるため)を意味しますか、または反変的なファンクタを意味しますか? http://math.stackexchange.com/questions/394472/is-cofunctor-an-accepted-term-for-contravariant-functors –

答えて

19

Functorが定義されています。 「一般的なファンクタ」という二重の概念は、まだまだ「一般的なファンクタ」です。

FunctorCofunctorは同じであるため、Functorを使用してモナドとコモノドの両方を定義します。しかし、モナドとコモノドが同じものだと思うようにしてはいけません。そうではありません。 comonad(再度、簡略化された)であるか否か

class Functor m => Monad where 
    return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 

モナドは、定義されたように(簡略化)さ

class Functor w => Comonad where 
    extract :: w a -> a 
    extend :: (w a -> b) -> w a -> w b 

注 "対称性"。 extract与えられたとextendあなたがfmapduplicateを生成することができ、それが与えられたことに注意

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 

、参考のため

import Data.Functor.Contravariant 
class Contravariant f where 
    contramap :: (b -> a) -> (f a -> f b) 
+6

ファンクタのデュアルではないでしょうか?C - > DファンクタD - > C?だから** **ファンクタのデュアルは同じファンクタそのものではありませんが、 "一般的なファンクタ"という二重の概念はまだ "一般的なファンクタ"です。私はセマンティクスを演奏していると思いますが、「ファンクタは自己デュアルです」という言葉は、個々のファンクタが自分自身の逆であると何らかの形で使用できるという主張のように聞こえる。 – Ben

+0

@Benあなたは正しいです。私はそれを訂正した。 –

+0

@Ben多かれ少なかれ、正式な定義に振り回される:https://en.wikipedia.org/wiki/Equivalence_of_categories#Definition – Zaaier

3


もう一つは、として定義され、反変ファンクタですreturn>>=あなたが作ることができるfmap,pure,<*>およびjoinである。したがって、ちょうどpure + >>=extract + extendに集中できます。

私は Monadクラスのみが仮想的なアプローチの並べ替えは、「物事を取り出す」を可能にしながら「で物事を置く」、および Comonadが容易になりますので、あなたが

class InverseFunctor f where 
    unmap :: (f a -> f b) -> a -> b 

のようなものを探しているかもしれないと想像

それに反対する何かをします、あなたの要求は最初は賢明に聞こえる。しかし、とextendとの間には、unmapを定義しようとする試みの途中で大きな非対称性があります。特に、>>=の最初の引数にはm aという型があることに注意してください。 extendの第2引数は、タイプw aではなく、aです。

+0

"unmap f = extract。f。return"と型シグニチャ"unmap :: Monad f、Comonad f =>(fa - > fb) - > a - > b" – Stratege

関連する問題