当前位置:  开发笔记 > 程序员 > 正文

为什么Haskell中没有`Cofunctor`类型类?

如何解决《为什么Haskell中没有`Cofunctor`类型类?》经验,为你挑选了2个好方法。

Monads fmap来自Functor类型类.为什么comonads不需要cofmapCofunctor类中定义的方法?



1> J. A. Corbal..:

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相同,monad和comonads都是通过使用来定义的Functor.但是不要让它让你认为monad和comonad是同一个东西,它们不是.

monad被定义(简化)为:

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)


不是算子C的双重 - > D是算子D - > C吗?所以****仿函数的双重性质本身并不是同一个仿函数,但"仿函数"的双重概念仍然是"一般的仿函数".我认为我只是在玩语义,但"仿函数是自我双重"的语言听起来像个人仿函数在某种程度上可以用作他们自己的反转或其他东西.

2> Heimdell..:

实际上,你错了:有一个!

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

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有